leetcode138 複製帶隨機指標的鍊錶

2021-10-05 13:16:17 字數 1489 閱讀 5832

給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。

要求返回這個鍊錶的 深拷貝。

我們用乙個由 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,隨機指標指向它自己。你必須返回給定頭的拷貝作為對轉殖列表的...