給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。
要求返回這個鍊錶的 深拷貝。
我們用乙個由 n 個節點組成的鍊錶來表示輸入/輸出中的鍊錶。每個節點用乙個 [val, random_index] 表示:
val:乙個表示 node.val 的整數。
random_index:隨機指標指向的節點索引(範圍從 0 到 n-1);如果不指向任何節點,則為 null 。
示例 1:
輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]
示例 3:
輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]
示例 4:
輸入:head =
輸出:解釋:給定的鍊錶為空(空指標),因此返回 null。
-10000 <= node.val <= 10000
node.random 為空(null)或指向鍊錶中的節點。
節點數目不超過 1000 。
這道題畫個圖會比較好理解,做法就是在原煉表中,在每個結點的後面複製乙個與它相同的結點。然後,讓複製的結點的random指標和被複製的結點的一樣。再將原鍊錶和複製鍊錶分離開來。
寫了兩個版本的**,區別在於乙個用的while迴圈,乙個用的for迴圈,用for迴圈會比較簡潔。還有就是在分離操作的時候,乙個用了雙指標,有點繁瑣,但是很好想啦。其實用乙個指標就可以完成分離操作,但要定義乙個dummy虛擬頭結點。
c++**如下:
1class
solution
12 auto k =head;
13while
(k)17 auto copy = head->next;
18 auto a = head, b = head->next->next;
19while
(b)25 a->next =b;
26return
copy;27}
28 };
更簡潔、更妙的解法如下:
1class
solution
1011
for(auto k = head; k; k = k->next->next)
14 auto dummy = new node(-1
);15 auto cur =dummy;
16for(auto p = head; p;p = p->next)
2122
return dummy->next;23}
24 };
LeetCode 138 複製帶隨機指標的鍊錶
1.題目 2.解答 第一次遍歷鍊錶的時候,複製舊鍊錶的節點值建立乙個新的鍊錶,同時定義乙個 unordered map 作為雜湊表,雜湊表的鍵為舊鍊錶的節點指標,值為新鍊錶的節點指標。然後,第二次遍歷鍊錶,訪問舊鍊錶節點的隨機指標,然後以此為鍵從 map 中取出對應的新鍊錶節點指標,這也就是當前新鍊...
Leetcode 138 複製帶隨機指標的鍊錶
題目 給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深拷貝。示例 輸入 got eof at end of input 1 next at position 9 ref 2 val 2 rand ref 2 val 1 my defini...
LeetCode 138 複製帶隨機指標的鍊錶
給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深拷貝。示例 解釋 節點 1 的值是 1,它的下乙個指標和隨機指標都指向節點 2 節點 2 的值是 2,它的下乙個指標指向 null,隨機指標指向它自己。你必須返回給定頭的拷貝作為對轉殖列表的...