(劍指offer)35 複雜鍊錶的複製

2021-09-27 02:46:37 字數 2441 閱讀 8747

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

思路:

1.先複製鍊錶節點的值放在原來的節點後面,組成乙個新的鍊錶

2.處理複雜指標:安排複製節點的複雜指標指向 原始節點複雜指標指向的下乙個

3.拆分這個鍊錶,偶數節點為原鍊錶,奇數節點為複製鍊錶。

要注意的是鍊錶最後尾節點需要指向none否則牛客網不能通過

class randomlistnode:

def __init__(self,x):

self.val = x

self.next = none

self.random = none

class solution:

def clone(self,phead):

if phead ==none:

return none

self.clonenodes(phead)

self.randomnodes(phead)

return self.reconnctnodes(phead)

# 將複製的鍊錶節點在其原始節點的後面

def clonenodes(self,phead):

pnode = phead

while pnode:

pcloned = randomlistnode(0)

pcloned.val = pnode.val

pcloned.next = pnode.next

pnode.next = pcloned

pnode = pcloned.next

# 安排複製節點的複雜指標 指向 原始節點指標的後乙個

def randomnodes(self,phead):

pnode = phead

while pnode:

pcloned = pnode.next

if pnode.random != none:

pcloned.random = pnode.random.next

pnode = pcloned.next

# 拆成兩個鍊錶

def reconnctnodes(self,phead):

# 第一種做法

pnode = phead

pclonedhead = pclonednode = phead.next

while pnode.next.next:

pclonednode.next = pnode.next.next

pnode = pnode.next

pclonednode = pclonednode.next

pnode.next = none #這裡要保證尾結點指向none 否則不能通過

return pclonedhead

# """第二種做法"""

# pnode = phead

# pclonedhead = pclonednode = phead.next

# pnode.next = pclonedhead.next

# pnode = pnode.next

# while pnode:

# pclonednode.next = pnode.next

# pclonednode = pclonednode.next

# pnode.next = pclonednode.next

# pnode = pnode.next

# return pclonedhead

if __name__ == '__main__':

node1 = randomlistnode(1)

node2 = randomlistnode(2)

node3 = randomlistnode(3)

node1.next = node2

node2.next = node3

node1.random = node3

node2.random = node1

s = solution()

clonenode = s.clone(node1)

print(clonenode.next.random.val)

劍指Offer 35 複雜鍊錶的複製

請實現啊函式complexlistnode clone complexlistnode phead 複製乙個 複雜鍊錶。在複雜鍊錶中除了有乙個m pnext指標指向下乙個節點,還有乙個m psaibling 指標指向鍊錶中的任意節點或者nullptr。節點定義如下 class complexlist...

劍指offer35 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 剛開始看題時還有點摸不著頭腦,感覺這道題沒有任何存在的意義。後來看了大家的討論才明白。思想...

劍指offer 35 複雜鍊錶的複製

面試題35.複雜鍊錶的複製 難度中等33 請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。示例 1 輸入 head 7,null 13,0 11,4 10,2...