Input: 1 -> 2 -> 3 -> 4 -> 5 -> null
Output: 5 -> 4 -> 3 -> 2 -> 1 -> null
方法 1:迭代法 (Iterative) 最常見
利用三指針(prev、curr、next)逐步反轉指向。
步驟:
方法 2:遞迴法 (Recursive)
用遞迴自然地把鏈表翻轉,最後一層返回新頭。
thoughts:
base case:如果 head == null 或 head.next == null,直接回傳 head。
遞迴反轉剩下的鏈表,設新頭為 newHead = reverse(head.next)。
修改指針:head.next.next = head,並設 head.next = null。
回傳 newHead。
時間複雜度:O(n)
空間複雜度:O(n)(因為遞迴呼叫堆疊)
方法 3:用 Stack(不推薦面試)
遍歷鏈表,把所有節點 push 進 stack。
再 pop 出來重建鏈表。
時間複雜度:O(n)
空間複雜度:O(n)
(一般面試不會用 stack,因為效率不佳)
class Solution {
fun reverseList(head: ListNode?): ListNode? {
var prev: ListNode? = null
var curr = head
while (curr != null) {
val nextNode = curr.next
curr.next = prev
prev = curr
curr = nextNode
}
return prev
}
}