題目描述
輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標random指向乙個隨機節點),請對此鍊錶進行深拷貝,並返回拷貝後的頭結點。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
看完題目應該很混亂,甚至還有點看不懂。
題目解析
看上面的,題目中說的複雜鍊錶表示,乙個節點有1-2個指標,除了指向下乙個節點的指標外,還可能存在乙個random指標,這個指標指向該鍊錶中某乙個節點的位置。如圖所示,a節點,除了乙個next指標指向b之外,還有乙個指標random指向c。
設計乙個演算法實現複雜鍊錶的深拷貝。
解題方法闡述
方法一:
1、遍歷鍊錶,複製每個結點,如複製結點a得到a1,將結點a1插到結點a後面;
2、重新遍歷鍊錶,複製老結點的隨機指標給新結點,如a1.random = a.random.next;
3、拆分鍊錶,將鍊錶拆分為原鍊錶和複製後的鍊錶
上述方法的圖示如下圖所示
具體**如下:
struct randomlistnode };
class
solution
//構造random
cur=phead;
while
(cur !=
nullptr
)else
cur=cur-
>next-
>next;
}//拆分鍊錶
cur=phead;
//新的頭節點
auto head=phead-
>next;
while
(cur !=
nullptr
)return head;}}
;
方法二:
假設鍊錶中的值沒有重複
使用unordered_map記錄每個節點的位置。具體操作步驟如下:
1.從頭節點開始遍歷,跟著->next方向建立所有的節點出來,同時用map記錄每個值在鍊錶的什麼位置。
2.為每個節點鏈結random。沿著老鍊錶的->next遍歷,根據每個節點->random的label鎖定random節點的位置,為相應新節點建立random鏈結。
具體**如下:
struct randomlistnode };
class
solution
//一定要重新指回到頭節點
p1=head;
p2=phead;
//random指標的鏈結
while
(p2 !=
nullptr
) p1=p1-
>next;
p2=p2-
>next;
}return head;}}
;
本次**沒有建立測試用例,可以參照我之前部落格中建立測試用例的方法建立測試用例執行檢視結果,建立測試用例時注意除了next指標,還要注意random指標的建立。 複雜鍊錶的複製(深拷貝)
給定乙個鍊錶,每個結點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中任何結點或者空結點,要求返回這個鍊錶的深拷貝。思路分析 1.破壞需要複製的複雜鍊錶,將新老節點串成乙個單鏈表的形式 2.解決random的指向問題 重要 cur.next.random cur.random.next 3.完成上述...
複雜鍊錶的拷貝
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 coding utf 8 class randomlistnode def in...
隨機指標鍊錶深拷貝
題目描述給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的 深拷貝。我們用乙個由 n 個節點組成的鍊錶來表示輸入 輸出中的鍊錶。每個節點用乙個 val,random index 表示 val 乙個表示 node.val 的整數。random ...