LeetCode138 鍊錶的深度拷貝

2021-09-24 02:19:49 字數 1319 閱讀 2323

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

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

示例:

輸入:

,"val":2},"random":,"val":1}

解釋:節點 1 的值是 1,它的下乙個指標和隨機指標都指向節點 2 。

節點 2 的值是 2,它的下乙個指標指向 null,隨機指標指向它自己。

這個題目有一定難度的,難度在於隨機指標。這個指標域該怎麼複製是乙個很重要的問題。

深度拷貝:原煉表和新鍊錶不互相影響,可以隨意更改。

這個題目可以用map來計算,主要是儲存隨機指標之間的邏輯關係,map中儲存的是位址和節點id的對映。

難點有兩點:

1.隨機指標指向了哪乙個節點?

2.這個節點的位址是多少?

而用map就是為了解決這兩點的。

我自己的思路:首先儲存隨機指標指向的id,然後新建新的指標,順便儲存值和指標以及隨機指標三個引數,返回新的指標。

寫**發現行不通,不知道該怎麼寫,儲存隨機指標以及儲存其他的指標都好寫,但是怎麼新建新指標和將新指標的next域、random域和原來的聯絡起來,這裡不知道怎麼寫。

這裡我的思路是有問題的,原因是我沒有想清楚該做什麼。我的思路是儲存隨機指標指向的id,這一步儲存id是對的,但是隨機指標不對,這裡儲存的應該是新鍊錶中的指標,而不是舊鍊錶,同理,新建新的指標時,值可以儲存,但是next指標和隨機指標不能一次性儲存的。

正確的方法,應該是,根據原鍊錶的長度建立新鍊錶,僅僅將值域的值賦值,next域和random域暫時不用管,並且將新節點存放到vector中,然後儲存舊節點的位址對應的id。

然後再次遍歷舊節點,連線新節點的next域,然後由於map中儲存的是舊節點的位址,所以對舊節點的random域取位址,該位址一定在map中,且對應的key值即為指向的id,結合該id在vector中索引,即可得到新節點中的random指標的位址。

最終**如下:

node*

copyrandomlist

(node* head)

node_vec.

push_back(0

);ptr = head;

i =0;

while

(ptr)

ptr = ptr->next;

i++;}

return node_vec[0]

;}

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