思路二
反轉乙個鍊錶
示例:結構體定義
先對原鍊錶做頭刪操作,再對新鍊錶做頭插定義乙個新head
頭指標,標記為newhead
,將它初始為null
,並非指向null
,最後我們選擇返回這個newhead
指標作為新鍊錶的頭指標。
定義乙個結點node
作為"臨時中轉站",初始化與否並無大影響。
進行迴圈遍歷鍊錶各個結點,判定head
指標是否為空,即是否到達了原鍊錶的結尾。如果不為空,說明還沒有到達尾部。如果程式第一次執行就沒有進入迴圈,說明傳入了乙個空鍊錶,此時返回newhead
新鍊錶的頭指標,同樣返回null
,這樣處理也是合理的。
以下開始逆序鍊錶邏輯:在當前指標不為null
時,先對原鍊錶做頭刪操作,再對新鍊錶做頭插操作。即使用迴圈進行操作:
讓node
指標指向傳入函式鍊錶的頭指標head
,兩指標指向保持相同。
然後讓head
指標指向它的next
結點,此時舊鍊錶已經完成了頭刪操作。第乙個結點已經被"切割"下來。接下來要做的就是對新鍊錶進行頭插操作,使結點放入新鍊錶。
讓node
指標的next
下乙個結點指向新鍊錶的頭指標newhead
,完成結點的鏈結,即頭插入新的鍊錶中。然後更新newhead
指向為新鍊錶的頭結點。進行下一次迴圈。
head
指標指向了原鍊錶的結尾,即為null
,退出迴圈,此時新鍊錶已經反轉完畢,情況如圖:
最終返回新煉表頭指標newhead
即可。
struct listnode *reverselist(struct listnode* head)
return newhead;
}
利用選擇語句,找到空鍊錶的情況,此情況返回null
空指標,因為空鍊錶不能反轉,或者說反轉之後還是乙個空鍊錶,返回空。
利用三個指標p0
"前指標"、p1
「當前指標」、p2
"後指標"來分批處理鍊錶元素,p0
置為null
,它將作為鍊錶的尾結點向前推進處理,p1
指向舊鍊錶的頭指標head
,p2
指向舊鍊錶的頭指標的next
結點。
開始遍歷鍊錶,迴圈判定因子為p1
,當它為空時到達鍊錶尾部跳出迴圈。否則在表中執行迴圈內邏輯:將p1
指向的當前結點的下乙個結點指向p0
,即前乙個結點。
此時p0
為null
,那麼p1
的下乙個結點就為空了,它現在是最後乙個結點。
然後將p0
指標指向p1
,將p1
指標指向p2
,注意這兩步不可以調換順序,否則正確向後挪移一位。此時完成了三個指標的一輪更迭。
判定p2
指標是否為空,如果為空說明此時p2
到達了鍊錶結尾,當前指標p1
的指向為最後乙個結點,它的next
即為空。如果不為空,將p2
更新到下乙個結點,進行下一次迴圈。
下一次進行迴圈時,就會把截斷結點鏈結到新鍊錶的頭部,同時更新三個指標。繼續迴圈。
迴圈終止條件為:p1
指向了鍊錶尾部的null
,此時p1
的前指標p0
即指向了反轉後的鍊錶,它就是新鍊錶的head
頭指標。此時返回p0
即可。
struct listnode *reverselist(struct listnode* head)
struct listnode *p0 = null;
struct listnode *p1 = head;
struct listnode *p2 = head->next;
while (p1 != null)
} return p0;
}
反轉乙個單鏈表
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?解題心路 迭代好說,遞迴 第一思路將後面的全部翻轉好,再將最後乙個元素的next指向當前。返回最後乙個元素的指標,那就有 當前節點指標 head ...
206 反轉鍊錶 反轉乙個單鏈表。
題解一 迭代法 在遍歷鍊錶時,將當前節點的 next 指標改為指向前乙個節點。由於節點沒有引用其前乙個節點,因此必須事先儲存其前乙個節點pre。在更改引用之前,還需要儲存後乙個節點。最後返回新的頭引用。definition for singly linked list.struct listnode...
LeetCode 206 反轉乙個單鏈表。
我是利用棧解決鍊錶的反轉 但是這種方法效率很低。看大佬的迭代或遞迴解法很簡短而且時間複雜度和空間複雜度都很小。官網上的題解 definition for singly linked list.public class listnode class solution listnode newhead ...