Description
給定一個單向鏈結串列的頭節點
head,將整個鏈結串列反轉後回傳新的頭節點。
Example:
Input: head = [1,2,3,4,5] Output: [5,4,3,2,1]
Intuition#
核心思路:逐一改變每個節點的 next 指針方向,讓它指向前一個節點。
- 鏈結串列反轉的本質就是把每條邊的方向反過來
- 迭代法:用三個指針 (prev, curr, next) 逐步翻轉
- 遞迴法:先遞迴到尾端,回溯時反轉指針
Approaches#
1: Recursive#
- 概念: 遞迴到鏈結串列的尾端,回溯時將每個節點的 next 節點的 next 指回自己,最後將自己的 next 設為 null
- 時間複雜度:
O(n)- 每個節點訪問一次 - 空間複雜度:
O(n)- 遞迴呼叫堆疊深度為 n
class Solution {
fun reverseList(head: ListNode?): ListNode? {
if (head?.next == null) return head
val newHead = reverseList(head.next)
head.next!!.next = head
head.next = null
return newHead
}
}⭐2: Iterative (Three Pointers)#
- 概念: 使用 prev、curr、next 三個指針,逐步將每個節點的 next 指向前一個節點
- 時間複雜度:
O(n)- 只需遍歷一次 - 空間複雜度:
O(1)- 只用三個指針變數
class Solution {
fun reverseList(head: ListNode?): ListNode? {
var prev: ListNode? = null
var curr = head
while (curr != null) {
val next = curr.next
curr.next = prev
prev = curr
curr = next
}
return prev
}
}遞迴解法在鏈結串列很長時可能導致 Stack Overflow。面試時通常偏好迭代解法。
🔑 Takeaways#
- Pattern: 鏈結串列反轉是最基礎的鏈結串列操作,是許多進階題的子問題(如 k-Group Reverse、Reorder List)
- 關鍵技巧: 三指針迭代法是 O(1) 空間反轉鏈結串列的標準做法,務必熟練