iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
自我挑戰組

30天 LeetCode 演算法實戰:Java 與 Python 解法比較系列 第 7

Day 07|Reverse Linked List:Java 與 Python 實作 Linked List

  • 分享至 

  • xImage
  •  

一、題目介紹
本題為LeetCode的Reverse Linked List
給定一個單向Linked List,需要將整個Linked List的節點順序反轉,最後回傳反轉後的頭節點。

例如:1 → 2 → 3 → 4 → 5
反轉後:5 → 4 → 3 → 2 → 1
因此原本的第一個節點會變成最後一個節點,而原本的最後一個節點則會成為新的頭節點。

二、解題思路
本題可以使用迭代(Iterative)的方式解決。
最重要的是利用三個指標:prevcurrentnext
三個指標各自負責不同工作:

  • 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
變成
https://ithelp.ithome.com.tw/upload/images/20260904/20178669QBpzJhlPmH.png

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實作
https://ithelp.ithome.com.tw/upload/images/20260904/20178669V6e07NBy9b.png

https://ithelp.ithome.com.tw/upload/images/20260904/20178669MmfpF7JAqL.png

五、Python實作
https://ithelp.ithome.com.tw/upload/images/20260904/20178669gsymtNCuYl.png

https://ithelp.ithome.com.tw/upload/images/20260904/20178669yNK2PAFnXV.png

六、時間與空間複雜度
Java

  • Time Complexity:O(n)
    • 每個節點只會被走訪一次。
    • 每次處理節點時只進行固定數量的操作。
  • Space Complexity:O(1)
    • 只使用prevcurrentnext三個指標。
    • 不需要建立新的Linked List。

Python

  • Time Complexity:O(n)
    • 需要將Linked List中的每個節點處理一次。
  • Space Complexity:O(1)
    • 只使用固定數量的指標變數。
    • 沒有額外建立陣列或其他與節點數量相關的資料結構。

七、Java與Python解法比較

  1. Linked List的操作方式
    Java:current.next
    Python:current.next
    兩種語言都是透過.next存取下一個節點。
    因此兩者的Linked List操作概念非常接近。

  2. 空節點的表示
    Java:null
    Python:None
    兩者都代表「目前沒有節點」。

  3. 指標移動
    Java:
    prev = current;
    current = next;

Python:
prev = current
current = next_node

雖然語法不同,但演算法完全相同。

  1. 反轉方式
    兩種語言都透過 current.next = prev
    將原本 1 → 2,改成 1 ← 2
    實際上並沒有重新建立節點,而是直接修改節點之間的連接方向

  2. 複雜度比較
    https://ithelp.ithome.com.tw/upload/images/20260904/201786699QD6kAvwqa.png
    兩種語言使用相同的迭代演算法,因此複雜度相同。

八、實作結果
LeetCode測試結果:Accepted

九、今日學習心得
今天學習了如何透過改變節點之間的next指向來反轉Linked List。

一開始看起來只是把 1 → 2 → 3 → 4,變成 4 → 3 → 2 → 1

但實際實作時,需要特別注意節點的連接關係。如果在改變current.next之前沒有先保存下一個節點,就可能失去後續Linked List的位置。

透過prevcurrentnext三個指標,可以在不建立新的Linked List的情況下完成反轉,因此時間複雜度為O(n),額外空間複雜度只有O(1)。

今天也更加理解Linked List與Array的不同。Array通常透過索引存取資料,而Linked List則需要透過節點之間的連接關係進行操作。

今天的核心觀念:先保存下一個節點,再改變next指向,最後移動指標。


上一篇
Day 06|Merge Two Sorted Lists:Java 與 Python 實作 Linked List
下一篇
Day 08|Linked List Cycle:Java 與 Python 實作 Fast & Slow Pointers
系列文
30天 LeetCode 演算法實戰:Java 與 Python 解法比較11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言