💡 題目描述
給你一個特殊的鏈結串列,每個節點除了 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];
回傳新串列的頭節點