圖解反轉單向連結串列【轉載】
我總覺的反轉連結串列的過程不是那麼好理解,花了點時間畫圖來幫助理解。
節點類如下:
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
現在有一個單向連結串列如下圖所示:
反轉後如下所示:
接下來解析反轉函式:
第一步: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 設為“頭節點”
第一次迴圈完畢,進入第二次迴圈,如下圖
第一步: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 設為“頭節點”)