1. 程式人生 > >圖解反轉單向連結串列【轉載】

圖解反轉單向連結串列【轉載】

我總覺的反轉連結串列的過程不是那麼好理解,花了點時間畫圖來幫助理解。

節點類如下:

public class Node {
    public int value;
    public Node next;

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

反轉單向連結串列的函式如下:

public Node reverseList(Node head){

    Node pre = null;
    Node next = null;

    while (head != null) {

        next = head.next;

        head.next = pre;

        pre = head;

        head = next;
    }

    return pre;
}

可以看到四行程式碼:

next = head.next; //1

head.next = pre; //2

pre = head; //3

head = next; //4

現在有一個單向連結串列如下圖所示:

正向連結串列

反轉後如下所示:
反向連結串列

接下來解析反轉函式:
反轉單向連結串列1
第一步:next = head.next
將 head.next 賦值給 next 變數,也就是說 next 指向了節點2,先將節點2 儲存起來。

第二步:head.next = pre
將 pre 變數賦值給 head.next,即 節點1 指向了 null

第三步:pre = head

將 head 賦值給了 pre,即 pre 指向節點1,將節點1 設為“上一個節點”

第四步:head = next

將 next 賦值給 head,即 head 指向了節點2。將節點2 設為“頭節點”

第一次迴圈完畢,進入第二次迴圈,如下圖
反轉單向連結串列2
第一步:next = head.next
將 head.next 賦值給 next 變數,也就是 next 指向了節點3,先將節點3 儲存起來。

第二步:head.next = pre
將 pre 賦值給 head.next,pre 在上一次迴圈的時候指向了節點1,那麼這一步的意義就是節點2 指向了 節點1,完成一次反轉

第三步:pre = head

將 head 賦值給了 pre,即 pre 指向節點2,將節點2 設為“上一個節點”

第四步:head = next

將 next 賦值給 head,即 head 指向了節點3。將節點3 設為“頭節點”

第二次迴圈完畢,以此類推!第三次第四次第五次迴圈。最後反轉成如下圖
完成反轉

總結

  • 儲存當前頭節點的下一個節點(當前頭節點為2,先將節點3 儲存起來)

  • 將當前頭節點的下一個節點指向 “上一個節點”(當前頭節點2 指向了 (“上一個節點”)節點1),這一步才是實現反轉

  • 將當前頭節點設定 “上一個節點”(將節點2 設為“上一個節點”)

  • 將儲存的下一個節點設定 “頭節點”(將節點3 設為“頭節點”)

轉載自:
https://blog.csdn.net/xyh269/article/details/70238501