最近開始學習資料結構和演算法的學習,也自然開始在 leetcode 上練習,所以每週大概會分享做過的leetcode 練習,盡量做到每天更新一道題目。
作為 leetcode 練習筆記的第一道題目,選擇了一道很經典的題目,反轉鍊錶。這是 leetcode 上的 206 題,鏈結如下:
input: 1->2->3->4->5->null
output: 5->4->3->2->1->null
反轉乙個單鏈表,首先肯定需要遍歷這個單鏈表,在遍歷的時候就希望修改當前結點的next
指標,指向其前乙個結點,因此肯定需要乙個儲存前乙個結點的變數,也就是反轉後鍊錶的頭部指標。
實現的思路應該是這樣的:
首先定義乙個prev
儲存前乙個結點,curr
儲存當前結點,然後還有乙個nxt
儲存下乙個結點,其中prev
就是最終的反轉鍊錶的頭結點;
先讓nxt
儲存下乙個結點;
然後改變curr
的next
指標,指向前乙個結點,即prev
;
接著,讓prev = curr
;
最後,就是讓curr = nxt
,指向下乙個結點
重複 2-5 步,直到當前結點為空。
下圖展示了上述幾個步驟的過程:
利用 python 的特性,實現的時候關鍵**其實就一行即可。
class
listnode:
def__init__
(self, x):
self.val = x
self.next = none
class
solution:
defreverselist
(self, head: listnode) -> listnode:
pre, cur = none, head
while cur:
pre, pre.next, cur = cur, pre, cur.next
return pre
LeetCode 反轉鍊錶
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?思路 雙指標,先用乙個指標算出鍊錶結點個數n,每次快指標從頭往先前移動n 步,慢指標往前移動1步進行交換即可。definition for sin...
LeetCode 反轉鍊錶
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 思路分析 直接一趟掃瞄即可。方法二 遞迴 definition for singly linked list.struct listnode class solution listnode reversea...
反轉鍊錶 LeetCode
遞迴版本稍微複雜一些,其關鍵在於反向工作。假設列表的其餘部分已經被反轉,現在我該如何反轉它前面的部分?假設列表為 n1 nk 1 nk nk 1 nm 若從節點 nk 1 到 nm 已經被反轉,而我們正處於 nk n1 nk 1 nk nk 1 nm 我們希望 nk 1 的下乙個節點指向 nk 所以...