劍指Offer 翻轉單鏈表

2021-10-01 13:18:37 字數 1131 閱讀 2441

定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。

樣例

輸入:1->2->3->4->5->null

輸出:5->4->3->2->1->null

有兩種方法。一種直觀的方法是使用棧,利用棧先進後出的特性。將節點的全部壓入棧,出棧的時候需要建立新的節點,連成鍊錶。這裡注意不要直接把鍊錶中的各個節點丟進去,否則再次串聯的時候鍊錶會成環,因為每個節點的後繼節點只有乙個。這種方法的時間複雜度和空間複雜度都是o(n)。

class

solution

stack

stack=

newstack

<

>()

;while

(head!=null)

//使用虛擬頭結點作為開始,要不然很麻煩

listnode vhead=

newlistnode(-

1); listnode p=vhead;

while

(!stack.

isempty()

)return vhead.next;

}}

第二種思路是原地逆置。無需額外空間,僅用幾個有限的指標則可以達到翻轉目的。空間複雜度是o(1)。還是那句話,鍊錶的題目要注意空指標異常。

直覺上想,如果想原地翻轉,將每個節點的next指標指向它前面的節點就好了。問題是,這樣做會丟失後面的節點,導致遍歷失敗。

我們可以使用三個指標。pre指向前面的節點,cur指向當前節點,next指向後面那個節點。每次cur.next=pre之後,都要及時地移動pre到cur上,同理也要移動cur到next上。相當於這三個指標的相對位置不要變

class

solution

listnode pre=null;

listnode cur=head;

listnode next=null;

while

(cur!=null)

return pre;

//返回的是pre,cur為null了。

}}

劍指offer之單鏈表的反轉

問題 輸入乙個鍊錶,將其進行反轉。思路 定義三個指標分別指向當前結點,前乙個結點,後乙個結點,然後依次反轉指標指向。具體 如下 c struct listnode int val listnode next listnode int x val x next nullptr class soluti...

劍指offer 單鏈表實現約瑟夫環

約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0 n 1,最後結果 1即...

劍指Offer 翻轉單詞順序

題目描述 牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am a stu...