給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。
要求返回這個鍊錶的 深拷貝。
我們用乙個由 n 個節點組成的鍊錶來表示輸入/輸出中的鍊錶。每個節點用乙個 [val, random_index] 表示:
輸入:head =[[
7,null],[
13,0]
,[11,
4],[
10,2]
,[1,
0]]輸出:[[7
,null],[
13,0]
,[11,
4],[
10,2]
,[1,
0]]
方法一:
採用map,map中的鍵是原鍊錶的每個節點,值是新生成的對應節點。遍歷鍊錶一遍完成map的構造。
然後只要將map中的新生成的鍊錶串起來即可。
class
solution1
; map, node *
> dic;
node * tmp = head;
// 建立乙個map,分別是原節點和新建立節點
while
(tmp)
node * res = head;
while
(head)
// 設定新節點的對應關係
return dic[res];}
};
方法二:
方法一中採用了額外的空間,該方法額外空間複雜度為o(1)。
在複製當前節點cur時,首先記錄cur的後續節點nextnode,然後根據cur建立乙個新節點dupcur,讓cur的next指向dupcur,dupcur的next指向nextnode,就能在原煉表中插入cur節點的複製節點。以此類推能夠將所有節點複製一遍。
重新遍歷新生成的鍊錶(新煉表中,每個原節點後面是複製的節點,但是random指標沒有設定),設定新節點的random指標。
將原節點和新節點依次分離。
class
solution
node * curnode = head,
*nextnode =
nullptr
;// 在每個原節點後面插入乙個對應的新節點
while
(curnode)
// 設定新節點的random關係
curnode = head;
while
(curnode)
curnode = curnode-
>next-
>next;
}// 分離兩個鍊錶
node * res = head-
>next;
curnode = head;
while
(curnode && curnode-
>next)
return res;}}
;
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,隨機指標指向它自己。你必須返回給定頭的拷貝作為對轉殖列表的...