1. 程式人生 > >【劍指Offer學習】【面試題16 :反轉連結串列】

【劍指Offer學習】【面試題16 :反轉連結串列】

題目:定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並輸出反轉後連結串列的頭結點。

連結串列結點定義如下:

public static class ListNode {
    int value;
    ListNode next;
}

解題思路:

在單鏈表的表頭臨時接入一個節點,然後進行尾插法操作。反轉單鏈表。

程式碼實現:

public class Test16 {
    public static class ListNode {
        int value;
        ListNode next;
    }

    /**
     * 定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並輸出反轉後連結串列的頭結點。
     *
     * @param
head 連結串列的頭結點 * @return 反轉後的連結串列的頭結點 */
public static ListNode reverseList(ListNode head) { // 建立一個臨時結點,當作尾插法的邏輯頭結點 ListNode root = new ListNode(); // 邏輯頭結點點的下一個結點為空 root.next = null; // 用於記錄要處理的下一個結點 ListNode next; // 當前處理的結點不為空 while
(head != null) { // 記錄要處理的下一個結點 next = head.next; // 當前結點的下一個結點指向邏輯頭結點的下一個結點 head.next = root.next; // 邏輯頭結點的下一個結點指向當前處理的結點 root.next = head; // 上面操作完成了一個結點的頭插 // 當前結點指向下一個要處理的結點 head = next; } // 邏輯頭結點的下一個結點就是返回後的頭結點
return root.next; } /** * 定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並輸出反轉後連結串列的頭結點。 * 【書本上的方法,不使用邏輯頭結點】 * * @param head 連結串列的頭結點 * @return 反轉後的連結串列的頭結點 */ public static ListNode reverseList2(ListNode head) { // 用於記錄反轉後的連結串列的頭結點 ListNode reverseHead = null; // 用於記錄當前處理的結點的 ListNode curr = head; // 用於記錄當前結點的前驅結點 // 前驅結點開始為null,因為了是反轉後的最後一個結點的下一個結點,即null ListNode prev = null; // 當前結點的下一個結點 ListNode next; // 對連結串列進行尾插法操作 while (curr != null) { // 記錄當前處理的結點,最後一個記錄的結點就是反轉後的頭結點 // 【注意:與書上的不同,因為curr.next=null時,curr此時就最後一個處理的結點, // 對應到反轉後的連結串列就是第一個結點,書上那樣做更精確,只是多了一些判斷,可以不要if】 reverseHead = curr; // 記錄當然前下一個結點 next = curr.next; // 當前結點的下一個結點指向前驅結點,這樣當前結點就插入到了反轉連結串列的頭部 curr.next = prev; // 記錄當前結點為前驅結點 prev = curr; // 當前結點點移動到下一個結點 curr = next; } // 返回轉後的頭結點 return reverseHead; } /** * 輸出連結串列的元素值 * * @param head 連結串列的頭結點 */ public static void printList(ListNode head) { while (head != null) { System.out.print(head.value + "->"); head = head.next; } System.out.println("null"); } public static void main(String[] args) { ListNode head = new ListNode(); head.value = 1; head.next = new ListNode(); head.next.value = 2; head.next.next = new ListNode(); head.next.next.value = 3; head.next.next.next = new ListNode(); head.next.next.next.value = 4; head.next.next.next.next = new ListNode(); head.next.next.next.next.value = 5; head.next.next.next.next.next = new ListNode(); head.next.next.next.next.next.value = 6; head.next.next.next.next.next.next = new ListNode(); head.next.next.next.next.next.next.value = 7; head.next.next.next.next.next.next.next = new ListNode(); head.next.next.next.next.next.next.next.value = 8; head.next.next.next.next.next.next.next.next = new ListNode(); head.next.next.next.next.next.next.next.next.value = 9; printList(head); head = reverseList(head); printList(head); head = reverseList2(head); printList(head); } }

執行結果:

這裡寫圖片描述