LeetCode 複製帶隨機指標的連結串列
給定一個連結串列,每個節點包含一個額外增加的隨機指標,該指標可以指向連結串列中的任何節點或空節點。
要求返回這個連結串列的深拷貝。
示例:
輸入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解釋:
節點 1 的值是 1,它的下一個指標和隨機指標都指向節點 2 。
節點 2 的值是 2,它的下一個指標指向 null,隨機指標指向它自己。
提示:
你必須返回給定頭的拷貝作為對克隆列表的引用。
思路分析:利用map關聯式容器輔助。第一遍掃描複製節點,並將原連結串列中的所有節點與新複製的節點一一對應的關聯,再掃描一遍原連結串列複製next、random指標內容。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
map<Node*, Node*> myMap;
Node *pHead = head, *tempPtr;
//掃描連結串列,複製所有的節點
while (pHead != NULL) {
tempPtr = new Node(pHead->val, pHead->next, pHead->random);
myMap[pHead] = tempPtr;//將原節點與新節點一一對應的關聯
pHead = pHead->next;
}
myMap[NULL] = NULL;
pHead = head;
//再次掃描連結串列,複製next、random指標
while (pHead != NULL){
myMap[pHead]->next = myMap[pHead->next];
myMap[pHead]->random = myMap[pHead->random];
pHead = pHead->next;
}
return myMap[head];
}
};
方法二:
① 首先掃描連結串列,複製所有的節點,並將複製的節點插入到原先節點的後面。
②再次掃描節點,複製所有原節點random指標域、
③再將兩個連結串列拆開
演算法示意圖
初始狀態
執行第一步複製節點
執行第二步複製random指標域
執行第三步拆分連結串列。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if (head == NULL){
return NULL;
}
Node *pHead = head, *tempPtr;
//掃描連結串列,複製所有的節點
while (pHead != NULL) {
tempPtr = new Node(pHead->val, pHead->next, pHead->random);//複製節點
//將這個複製的節點插入到複製源的後面
tempPtr->next = pHead->next;
pHead->next = tempPtr;
pHead = pHead->next->next;//移動必須是移動兩個一次,因為剛剛在後面插入了一個複製的節點
}
//再次掃描節點,複製random節點
pHead = head;
while (pHead != NULL) {
if (pHead->random != NULL) {
//pHead->next是pHead的複製,所以pHead->random->next的複製是pHead->random
pHead->next->random = pHead->random->next;
}
else {
pHead->next->random = NULL;
}
pHead = pHead->next->next;
}
//在將兩個連結串列拆開
pHead = head;
Node *copyHead = pHead->next;
while (pHead != NULL) {
tempPtr = pHead->next;
pHead->next = pHead->next->next;
if (tempPtr->next != NULL) {
tempPtr->next = tempPtr->next->next;
}
pHead = pHead->next;
}
return copyHead;
}
};
相關文章
- LeetCode-138-複製帶隨機指標的連結串列LeetCode隨機指標
- LeetCode 138:複製帶隨機指標的連結串列 Copy List with Random PointerLeetCode隨機指標random
- [連結串列]leetcode138-複製帶隨即指標的連結串列LeetCode指標
- 「複製帶隨機指標的連結串列」的一個很巧妙解法隨機指標
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 隨機連結串列的複製隨機
- 劍指 Offer 35. 複雜連結串列的複製
- 複雜連結串列的複製
- leetcode 876. 連結串列的中間結點(快慢指標法)LeetCode指標
- 單連結串列複製你已經會了,如果我們再加個指標...指標
- JZ-025-複雜連結串列的複製
- Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度LeetCode指標時間複雜度
- 面試題35:複雜連結串列的複製面試題
- golang二級指標操作連結串列Golang指標
- (轉發)連結串列新增函式中為什麼要用指向連結串列指標的指標(引用傳參)函式指標
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- Leetcode_86_分割連結串列_連結串列LeetCode
- LeetCode-Python-86. 分隔連結串列(連結串列)LeetCodePython
- LeetCode-連結串列LeetCode
- 淺複製和深複製的概念與值複製和指標複製(引用複製)有關 淺複製 “指標複製 深複製 值複製指標
- 【原創】淺談指標(十)連結串列的寫法指標
- LeetCode 143 重排連結串列 HERODING的LeetCode之路LeetCode
- LeetCode 86 ——分隔連結串列LeetCode
- LeetCode連結串列專題LeetCode
- leetcode 反轉連結串列LeetCode
- [Golang]力扣LeetBook—初級演算法—連結串列—迴文連結串列(快慢指標)Golang力扣演算法指標
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 單連結串列增刪改查(無頭指標)指標
- day4 連結串列-模擬與快慢指標指標
- leetcode-82:刪除排序連結串列中重複的元素-iiLeetCode排序
- 劍指offer-----刪除連結串列中的重複節點
- leetcode160 相交連結串列(讓兩個連結串列從同距離末尾同等距離的位置開始遍歷,當較長的連結串列指標指向較短連結串列head時,長度差就消除了)LeetCode指標
- 複雜連結串列的復刻
- leetcode 92 反轉連結串列ⅡLeetCode
- LeetCode-143-重排連結串列LeetCode
- LeetCode 86. 分隔連結串列LeetCode
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素