將鍊錶拆成正常順序的list和對應random指標的map。然後複製這個list和map得到新的鍊錶
時間複雜度:o(n)
空間複雜度:o(n)
class
solution
:def
clone
(self, phead)
: lian =
biao =
p = phead
# 複製鍊錶,此時list裡仍是舊鍊錶
while p:
p = p.
next
# 得到每個節點的random節點index
p = phead
i =0while p:
if p.random:
biao[i]
= lian.index(p.random)
else
: biao[i]=-
1 p = p.
next
i +=
1# new乙個新的鍊錶
new_lian =
[randomlistnode(p.label)
for p in lian]
# 遍歷更新新鍊錶的random和next關係
for i in
range
(len
(new_lian)):
if i <
len(new_lian)-1
: new_lian[i]
.next
= new_lian[i+1]
if biao[i]!=-
1:new_lian[i]
.random = new_lian[biao[i]
]return new_lian[0]
if new_lian else
none
利用map查詢(o(1))next和random節點是否已經存在,不存在建立新的節點並且更新map,存在直接對映到已存在的節點。
時間複雜度:o(2n)
空間複雜度:o(n)
class
solution
:def
clone
(self, phead):if
not phead:
return
none
biao =
p = phead
# 定義map中原節點指向新的節點,注意在python中list的查詢是o(n),而dict是o(nlog(n)),另外set是o(log(n))但是無法儲存對映關係
biao[p]
= randomlistnode(p.label)
new_p = biao[p]
new_head = new_p
while p:
if p.
next
:# 判斷next節點是否已經建立過(在map中存在)
if p.
next
notin biao:
biao[p.
next
]= randomlistnode(p.
next
.label)
new_p.
next
= biao[p.
next
]if p.random:
if p.random not
in biao:
biao[p.random]
= randomlistnode(p.random.label)
new_p.random = biao[p.random]
p = p.
next
new_p = new_p.
next
return new_head
hashmap hashmap = new hashmap<
>()
;public randomlistnode clone
(randomlistnode phead)
//為random 節點賦值
if(cur.random != null)
//移動指標
cur = cur.next;
temp = temp.next;
}return randomlistnode;
}在每個原節點後面複製新的節點,例如原a->新a->原b->新b->…,遍歷兩次分別更新新節點的next和random指向,最後拆出新節點形成新鍊錶。
時間複雜度:o(2n)
空間複雜度:o(2n)
class
solution
:def
clone
(self, phead):if
not phead:
return
none
# 在原節點後面加上新節點,並得到新的next關係
p = phead
while p:
temp = p.
next
clone = randomlistnode(p.label)
p.next
= clone
clone.
next
= temp
p = temp
# 對所有新節點加上其random節點
p = phead
while p:
if p.random:
p.next
.random = p.random.
next
# 注意此時的random其實是原來random的複製節點,也就是random.next而不是random
p = p.
next
.next
#拆分新節點,注意末尾節點的next=none?判斷
new_head = phead.
next
p = phead
while p:
clone = p.
next
p.next
= clone.
next
p = p.
next
if clone.
next
: clone.
next
= p.
next
return new_head
public class solution
randomlistnode currentnode = phead;
//1、複製每個結點,如複製結點a得到a1,將結點a1插到結點a後面;
while
(currentnode != null)
currentnode = phead;
//2、重新遍歷鍊錶,複製老結點的隨機指標給新結點,如a1.random = a.random.next;
while
(currentnode != null)
//3、拆分鍊錶,將鍊錶拆分為原鍊錶和複製後的鍊錶
currentnode = phead;
randomlistnode pclonehead = phead.next;
while
(currentnode != null)
return pclonehead;}}
劍指offer複雜鍊錶複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...
劍指offer 複雜鍊錶複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a...
劍指offer 複雜鍊錶複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 非遞迴方法 struct randomlistnode randomlistno...