LeetCode習題 反轉鍊錶

2021-10-22 12:46:00 字數 1612 閱讀 4159

輸入: 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 所以...