思路一:首先忽略ran
do
mrandom
random
指標,遍歷給定鍊錶h
1h_1
h1,同時建立出它的深拷貝h
2h_2
h2,並建立從h
1h_1
h1到h
2h_2
h2的對映。然後我們再次遍歷鍊錶h
1h_1
h1,有了對映關係,就可以修改ran
do
mrandom
random
指標了。
/*
// definition for a node.
class node
};*/
class
solution
cur1=myhead.next;
cur2=head;
while
(cur2)
return myhead.next;}}
;
思路二:和思路一一樣,但是我們可以一步到位,無需遍歷h
1h_1
h1兩遍。
/*
// definition for a node.
class node
};*/
class
solution
cur1=cur1-
>next;if(
!cur2-
>random)
//處理random指標
if(m.
find
(cur2-
>random)
!=m.
end())
cur1-
>random=m[cur2-
>random]
;else
cur2=cur2-
>next;
}return myhead.next;}}
;
思路三:這個思路相當巧妙,可以做到o(1
)o(1)
o(1)
的空間複雜度。先遍歷一遍h
1h_1
h1,每個節點進行自我複製,並將其連線到自己後面,比如:a
−>b−
>
ca->b->c
a−>b−
>
c,經過這次操作後就變成了a
−>a−
>b−
>b−
>c−
>
ca->a->b->b->c->c
a−>a−
>b−
>b−
>c−
>
c;再遍歷一遍h
1h_1
h1,這個時候處理ran
do
mrandom
random
指標就比較容易了;最後遍歷一遍h
1h_1
h1,將其拆分成兩個鍊錶即可。
/*
// definition for a node.
class node
};*/
class
solution
cur=head;
//處理random指標
while
(cur)
node ans(0
),*pre=
&ans;
cur=head;
while
(cur)
return ans.next;}}
;
138 複製帶隨機指標的鍊錶
給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深度拷貝。definition for singly linked list with a random pointer.struct randomlistnode class solutio...
138 複製帶隨機指標的鍊錶
138.複製帶隨機指標的鍊錶 回溯演算法的第一想法是將鍊錶想象成一張圖。鍊錶中每個節點都有2個指標 圖中的邊 因為隨機指標給圖結構新增了隨機性,所以我們可能會訪問相同的節點多次,這樣就形成了環 上圖中,我們可以看到隨機指標指向了前乙個節點,因此形成了環。我們需要考慮這種環的實現。此方法中,我們只需要...
138 複製帶隨機指標的鍊錶
題目 給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的 深拷貝。我們用乙個由 n 個節點組成的鍊錶來表示輸入 輸出中的鍊錶。每個節點用乙個 val,random index 表示 val 乙個表示 node.val 的整數。random i...