138 複製帶隨機指標的鍊錶

2021-10-07 12:57:14 字數 3102 閱讀 5644

138. 複製帶隨機指標的鍊錶

回溯演算法的第一想法是將鍊錶想象成一張圖。鍊錶中每個節點都有2個指標(圖中的邊)。因為隨機指標給圖結構新增了隨機性,所以我們可能會訪問相同的節點多次,這樣就形成了環

上圖中,我們可以看到隨機指標指向了前乙個節點,因此形成了環。我們需要考慮這種環的實現。

此方法中,我們只需要遍歷整個圖並且拷貝它。拷貝的意思是每當遇到乙個新的沒有訪問過的節點,你都要創造乙個新的節點。遍歷按照深度優先進行。我們需要在回溯的過程中記錄已經訪問過的節點,否則因為隨機指標的存在進入死迴圈。

演算法:

/*

// definition for a node.

class node }*/

class

solution

if(map.

containskey

(head)

) node node =

newnode

(head.val)

; node.next = null;

node.random = null;

map.

put(head, node)

; node.next =

copyrandomlist

(head.next)

; node.random =

copyrandomlist

(head.random)

;return node;

}}

時間複雜度:o(n) ,其中 nn 是鍊錶中節點的數目。

空間複雜度:o(n)。如果我們仔細分析,我們需要維護乙個回溯的棧,同時也需要記錄已經被深拷貝過的節點,也就是維護乙個已訪問字典。漸進時間複雜度為 o(n)。

// 最後的最後,newnode指向null

時間複雜度:o(n)。因為我們需要將原鍊錶逐一遍歷。

空間複雜度:o(n)。 我們需要維護乙個字典,儲存舊的節點和新的節點的對應。因此總共需要 n 個節點,需要 o(n)的空間複雜度。

// 跳出迴圈之後:orgigila = null

初始化乙個map,第一次遍歷原始鍊錶,使用這些鍊錶的值拷貝,並且map[舊節點] = 新節點

第二次遍歷鍊錶,給新節點之間連上線

138 複製帶隨機指標的鍊錶

給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深度拷貝。definition for singly linked list with a random pointer.struct randomlistnode class solutio...

138 複製帶隨機指標的鍊錶

題目 給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的 深拷貝。我們用乙個由 n 個節點組成的鍊錶來表示輸入 輸出中的鍊錶。每個節點用乙個 val,random index 表示 val 乙個表示 node.val 的整數。random i...

138 複製帶隨機指標的鍊錶

package leetcode public class demo 138 node otemp head 在每個節點之後複製乙個相同的節點 while otemp null 每個節點後插入乙個相同的節點 otemp.next t otemp otemp.next.next 複製隨機指標 otem...