輸入: 1->2->3->4->5->null 輸出: 5->4->3->2->1->null
解題思路:遍歷鍊錶的同時,prev指標保持指向反轉後鍊錶的頭節點,pcur指標沿著鍊錶移動,移動的同時,將pcur當前指向的節點插入到prev之前,prev重新指向最新頭結點,pcur繼續移動,直到鍊錶尾部結束/**
* definition for singly-linked list.
* public class listnode
* public init(_ val: int)
* public init(_ val: int, _ next: listnode?)
* }*/class
solution
// 哨兵節點
let sentinel =
listnode(-
1)sentinel.next = head
var prev = sentinel.next
var pcur = prev?
.next
while
(pcur !=
nil)
return sentinel.next
}}
優化寫法class
solution
return prev
}}
複雜度分析
時間複雜度:o(n), n為鍊錶長度,需要遍歷整個鍊錶
空間複雜度:o(1),未額外申請儲存空間解題思路:遞迴版本稍微複雜一些,其關鍵在於反向工作。假設鍊錶的其餘部分已經被反轉,現在應該如何反轉它前面的部分?假設鍊錶為:
n1→…→nk−1→nk→nk+1→…→nm→∅
####若從節點 nk+1 到 nm已經被反轉,而我們正處於 nk。
n1→…→nk−1→nk→nk+1←…←nm
####我們希望 nk+1的下乙個節點指向 nk。所以,
nk.next.next=nk。
####需要注意的是 n1下乙個節點必須指向 ∅。如果忽略了這一點,鍊錶中可能會產生環。
/**
* definition for singly-linked list.
* public class listnode
* public init(_ val: int)
* public init(_ val: int, _ next: listnode?)
* }*/class
solution
let newhead =
reverselist
(head?
.next)
head?
.next?
.next = head
head?
.next =
nilreturn newhead
}}
複雜度分析
時間複雜度:o(n), 其中 n 是鍊錶的長度。需要對鍊錶的每個節點進行反轉操作。
空間複雜度:o(n), 其中 n 是鍊錶的長度。空間複雜度主要取決於遞迴呼叫的棧空間,最多為 n 層。
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 所以...