劍指OFFER 複雜鍊錶的複製

2021-09-28 23:28:04 字數 3718 閱讀 9106

將鍊錶拆成正常順序的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...