一、題目介紹
本題為LeetCode的Reverse Linked List
給定一個單向Linked List,需要將整個Linked List的節點順序反轉,最後回傳反轉後的頭節點。
例如:1 → 2 → 3 → 4 → 5
反轉後:5 → 4 → 3 → 2 → 1
因此原本的第一個節點會變成最後一個節點,而原本的最後一個節點則會成為新的頭節點。
二、解題思路
本題可以使用迭代(Iterative)的方式解決。
最重要的是利用三個指標:prev、current、next
三個指標各自負責不同工作:
prev:指向已經反轉完成的前一個節點current:目前正在處理的節點next:暫時保存下一個節點為什麼需要next?因為如果直接改變 current.next
原本指向下一個節點的資訊就可能遺失,所以每次反轉前,必須先把下一個節點保存起來。
三、解題流程
假設Linked List為 1 → 2 → 3 → null
一開始 prev = null, current = 1
Step 1:保存下一個節點
先記錄 next = current.next
也就是 next=2
Step 2:反轉目前節點
將 current.next 改成指向 prev → current.next = prev
因此 1 → null
Step 3:移動指標
prev = current
current = next
變成
Step 4:重複以上流程
繼續處理2:2 → 1 → null
再處理3:3 → 2 → 1 → null
最後
current = null
prev = 3
因此回傳3 → 2 → 1 → null
而整題核心就是
next = current.next
current.next = prev
prev = current
current = next
可以記成先保存 → 再反轉 → 移動 prev → 移動 current
四、Java實作

五、Python實作

六、時間與空間複雜度
Java
prev、current、next三個指標。Python
七、Java與Python解法比較
Linked List的操作方式
Java:current.next
Python:current.next
兩種語言都是透過.next存取下一個節點。
因此兩者的Linked List操作概念非常接近。
空節點的表示
Java:null
Python:None
兩者都代表「目前沒有節點」。
指標移動
Java:
prev = current;
current = next;
Python:
prev = current
current = next_node
雖然語法不同,但演算法完全相同。
反轉方式
兩種語言都透過 current.next = prev
將原本 1 → 2,改成 1 ← 2
實際上並沒有重新建立節點,而是直接修改節點之間的連接方向。
複雜度比較
兩種語言使用相同的迭代演算法,因此複雜度相同。
八、實作結果
LeetCode測試結果:Accepted
九、今日學習心得
今天學習了如何透過改變節點之間的next指向來反轉Linked List。
一開始看起來只是把 1 → 2 → 3 → 4,變成 4 → 3 → 2 → 1
但實際實作時,需要特別注意節點的連接關係。如果在改變current.next之前沒有先保存下一個節點,就可能失去後續Linked List的位置。
透過prev、current和next三個指標,可以在不建立新的Linked List的情況下完成反轉,因此時間複雜度為O(n),額外空間複雜度只有O(1)。
今天也更加理解Linked List與Array的不同。Array通常透過索引存取資料,而Linked List則需要透過節點之間的連接關係進行操作。
今天的核心觀念:先保存下一個節點,再改變next指向,最後移動指標。