面試題「單鏈表逆序」

本文為原創文章,如需轉載請注明出處,謝謝!

扯淡

今天出去面試又碰到這題了,從畢業到現在面試這么多次,也碰上了不少次這道題,可見這題的重要性。然而面試前沒復習這題,導致面試的時候底氣不足,雖然思路說對了,但是還是對自己的表現不滿意。原因就是算法題當時解出來的時候印象非常深刻,但是過后的工作中很少涉及,很容易淡忘。所以必須要總結,把每次面試的坑都總結下來,為之后的面試做準備。

正題

廢話不說了,直接給大家看張我總結的思路圖。

單鏈表逆序

我們對照著圖一步一步的分析,幫助大家記憶。

1.定義三個節點引用

我們用 java 語言實現就需要先定義三個節點引用,Prev表示上一個節點,Head表示當前節點,Next則表示下一個節點。然后讓 Prev 指向 Null,Head 指向鏈表的頭節點,Next 也指向 Null。

2.逆序過程

最重要的一步,這步會了,以后的步驟都是重復第一步,循環即可。

(1) 初始狀態,Head—>A,Prev—>Null,Next—>Null。

(2) Next = Head.next,首先用 Next 引用緩存下一個節點,為什么這是第一步?因為如果先將 Head.next 逆序指向前面節點,下一個節點就丟了,就沒有引用可以拿到下一個節點了。

(3) Head.next = Prev,再將當前節點的下一個節點指向 Head 前面的節點,完成逆序。

(4) 到現在為止,Prev—>Null,Head—>A(頭結點),Next—>B,A.next—>Prev(Null)。然后,需要將 Prev 和 Head 都向右移動,即 Prev—>Head(A),Head—>Next(B)。這步操作完之后就得到了圖中的第二條。

3.再來一遍

不明白第一步沒關系,我們繼續分析第二步。流程和 (1) 完全一致。

(1) 初始狀態,Head—>B,Prev—>A,Next—>A(上一步中沒對 Next 做操作,所以還是指向 A)。

(2) Next = Head.next。同樣先緩存下一個節點,現在 Next—>C。

(3) Head.next = Prev,將當前節點的鏈和前一節點連接,現在 B.next—>Prev(A)

(4) 目前情況是,Prev—>A,Head—>B(頭結點),Next—>C,B.next—>Prev(A),同樣地,向右移動 Prev 和 Head,即 Prev->Head(B),Head—>Next(C)。完成之后就得到了圖中的第三條。

4.再來一遍,重要的事說三遍

再重復一遍,要是還不知道過程我也沒轍了~

(1) 初始狀態,Head—>C,Prev—>B,Next—>B。

(2) Next = Head.next。緩存下一個節點,現在 Next—>D。

(3) Head.next = Prev,將當前節點的鏈和前一節點連接,現在 C.next—>Prev(B)

(4) 目前情況是,Prev—>B,Head—>C(頭結點),Next—>D,B.next—>Prev(B),同樣地,向右移動 Prev 和 Head,即 Prev->Head(C),Head—>Next(D)。

5.偽代碼

分析了這么多,我們知道了逆序的流程,得到如下偽代碼:

Next = Head.next;
Head.next = Prev;//讓鏈指向前節點
Prev = Head;//右移
Head = Next;

6.結束條件

循環終止的條件是什么呢?請看圖中后兩條,當只剩一個節點 E 沒完成逆序的時候,還需要再重復一次剛才的步驟,向右移動 Prev 和 Head 后就得到了最后一條,看到 Head 指向了 Null(是右移 Head 的時候,Head—> Next,此時的 Next 為 E.next=Null)。所以判斷條件為 while(Head != null)

7.完整代碼

最后,附上完整代碼。空間復雜度為 O(n)。

public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null) return null;
        
    ListNode prev = null;
    ListNode next = null;
    
        while(head != null) {
            next = head.next;
            head.next = prev;
            prev = head;
            head = next;
        }
        return prev;
    }
}

這次詳細總結了以后,相信再面試再也不怕「單鏈表逆序」了!

我也是個初學者,如寫的有問題,請及時聯系我!感謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容