1. 程式人生 > >單鏈表反轉

單鏈表反轉

循環 col 過程 str oid public 技術 next() 臨時

1定義

單鏈表node的數據結構定義如下:

class Node {
        // 註:此處的兩個成員變量權限不能為private,因為private的權限是僅對本類訪問
        int data;// 數據域
        Node next;// 指針域

        public Node(int data) {
            this.data = data;
        }

        public int getData() {
            return data;
        }

        public void setData(int
data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }

2 方法1:就地反轉法

2.1 思路

把當前鏈表的下一個節點pCur插入到頭結點dummy的下一個節點中,就地反轉。

dummy->1->2->3->4->5的就地反轉過程:

dummy->2->1->3->4->5dummy->3->2->1->4->5dummy->4>-3->2->1->5dummy->5->4->3->2->1

2.2 解釋

1初始狀態

技術分享

2 過程

pCur是需要反轉的節點。

  1. prev連接下一次需要反轉的節點
  2. 反轉節點pCur
  3. 糾正頭結點dummy的指向
  4. pCur指向下一次要反轉的節點

偽代碼

1 prev.next = pCur.next;
2 pCur.next = dummy.next;
3 dummy.next = pCur;
4 pCur = prev.next;

技術分享

技術分享

3 循環條件

pCur is not null

2.3 代碼

// 1.就地反轉法
    public Node reverseList1(Node head) {
        if (head == null)
            return head;
        Node dummy = new Node(-1);
        dummy.next = head;
        Node prev = dummy.next;
        Node pCur = prev.next;
        while (pCur != null) {
            prev.next = pCur.next;
            pCur.next = dummy.next;
            dummy.next = pCur;
            pCur = prev.next;
        }
        return dummy.next;
    }

2.4 總結

  • 1個頭結點,2個指針,4行代碼
  • 註意初始狀態和結束狀態,體會中間的圖解過程。

3 方法2:新建鏈表,頭節點插入法

3.1 思路

新建一個頭結點,遍歷原鏈表,把每個節點用頭結點插入到新建鏈表中。最後,新建的鏈表就是反轉後的鏈表。

3.2 解釋

1 初始狀態

技術分享

2 過程

pCur是要插入到新鏈表的節點。

pNex是臨時保存的pCur的next。

  1. pNex保存下一次要插入的節點
  2. 把pCur插入到dummy中
  3. 糾正頭結點dummy的指向
  4. pCur指向下一次要插入的節點

偽代碼

1 pNex = pCur.next
2 pCur.next = dummy.next
3 dummy.next = pCur
4 pCur = pNex

技術分享

3 循環條件

pCur is not null

3.3 代碼

    // 2.新建鏈表,頭節點插入法
    public Node reverseList2(Node head) {
        Node dummy = new Node(-1);
        Node pCur = head;
        while (pCur != null) {
            Node pNex = pCur.next;
            pCur.next = dummy.next;
            dummy.next = pCur;
            pCur = pNex;
        }
        return dummy.next;
    }

3.4 總結

  • 1個頭結點,2個指針(包含一個臨時保存節點的pNex),4行代碼
  • 註意初始狀態和結束狀態,體會中間的圖解過程。

測試代碼:

LinkList list4 = new LinkList();
        for (int i = 5; i < 10; i++) {
            list4.add(i);
        }
        LinkList list5 = new LinkList();
        list5.head = list4.reverseList2(list4.head);
        System.out.print("反轉後的鏈表為:");
        System.out.print("\r\n");
        list5.print(list5.head);// 從head節點開始遍歷輸出

結果:

反轉後的鏈表為:
9
8
7
6
5

單鏈表反轉