iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0

💡 題目描述

給你一個特殊的鏈結串列,每個節點除了 next 外,還有一個 random 指標,
它可以指向串列中的任何節點(或是 NULL)。

請你回傳這個鏈結串列的「深拷貝(deep copy)」,
也就是建立一份完全獨立的新串列,其中每個節點的值和指標都正確複製。

範例:

輸入:
Node1(val=7, random=NULL)
Node2(val=13, random=Node1)
Node3(val=11, random=Node5)
Node4(val=10, random=Node3)
Node5(val=1, random=Node1)

輸出:
新的鏈結串列結構相同,但節點為不同記憶體位址

🧩 解題思路(完整版)

這題是「鏈結串列」的終極挑戰之一,
因為它讓指標不再只有「下一個」,而是出現「平行的任意連結」。
換句話說,這題是「二維指標思維」的實戰!

🔍 解題關鍵一:複製節點但保持映射

首先,我們得建立新節點與舊節點的一一對應關係,
常見作法是使用 unordered_map(C++)或 HashMap(Java)來記錄:

original_node -> copied_node

這樣當我們遇到 random 指向某節點時,
就能直接找到它的新版本節點,而不會搞混。

🔁 解題步驟(用 C 思維講給懂指標的人聽)

第一次遍歷:複製節點(但不連線)
建立新節點(malloc),並將每個舊節點對應到新節點存入 map。

第二次遍歷:連接 next 與 random
用 map 取得對應的新節點,
並設定:

new_node->next = map[old_node->next];
new_node->random = map[old_node->random];

回傳新串列的頭節點


上一篇
指標進階 2— 雙向鏈結串列
系列文
用leetcode系統化學習C語言30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言