定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。
樣例
輸入: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...