leetcode138 複製帶隨機指標的鍊錶

2021-10-23 13:31:26 字數 1377 閱讀 8090

傳送門

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

要求返回這個鍊錶的 深拷貝(兩個鍊錶只是形狀一樣,儲存空間無關聯)

劍指offer35 p187

方法1. hash對映 時間o(n) 空間o(n)

用hash表oldmap存下舊鍊錶的 node引用 和索引i,同時用陣列newlist記錄新鍊錶節點的引用,此時newlist的下標就是和上面的i對應。然後同時遍歷舊、新鍊錶 查詢舊鍊錶的random的引用對應的索引index, 通過index在newlist中找到新煉表中應該對應的random節點,新鍊錶節點指向中國random節點.

注意判斷 舊鍊錶random是否是null.

public node copyrandomlist

(node head)

curnode = newhead.next;

worknode = head;

while

(i--

>0)

worknode = worknode.next;

curnode = curnode.next;

}return newhead.next;

}

方法2. 扭曲舊鍊錶 時間o(n)空間o(1)

扭曲原來的鍊錶: 將每個拷貝節點都放在原來對應節點的旁邊。

遍歷原來的鍊錶並拷貝每乙個節點,將拷貝節點放在原來節點的旁邊,創造出乙個舊節點和新節點交錯的鍊錶。

迭代這個新舊節點交錯的鍊錶,並用舊節點的 random 指標去更新對應新節點的 random 指標。比方說, b 的 random 指標指向 a ,意味著 b』 的 random 指標指向 a』 。

next 指標也像上面一樣賦值,

直接copy的題解**:

public

class

solution

// 賦隨機指標

//注意!這裡拷貝節點(ptr.next)的random指向的是ptr.random的next

//也要是拷貝節點

ptr = head;

while

(ptr != null)

// a->a'->b->b'->c->c' 拆分成 a->b->c and a'->b'->c'

node newhead = head.next;

node p = head, q = p.next;

while

(p != null)

return newhead;

}}

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