題目描述
輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
題目分析
1.如果鍊錶為空鍊錶,則返回本身即可
2.如果非空 需要進行複製操作,如果沒有特殊指標,只需要複製next我相信大家都能很快做出來,但是加上特殊指標這就需要一定技巧,因為特殊指標隨便指,而你每次找特殊指標所指的節點都需要從頭開始遍歷找起,這顯然複雜度高達o(n²)
下面介紹乙個巧妙地思想方法:
如圖 首先第一步 複製原來的鍊錶,順次連線形成新鍊錶
clonode = phead第二步,利用原節點的random指向,來用複製的相應節點的randomwhile clonode:
#完成第一步的核心操作
node = randomlistnode(clonode.label)
node.next = clonode.next
clonode.next = node
clonode = node.next #下一次操作
node = clonode.next #指向複製的結點
if clonode.random: #如果原節點有特殊指標
node.random = clonode.random.next #則複製的節點的特殊指標指向原節點的特殊指標指向的下乙個值 看圖更好理解一些
clonode = node.next
最後一步,將複製好的鍊錶拆分出來,或者說將 偶數字的節點重新拆分合成新的鍊錶,得到的就是複製的鍊錶
#完成第三步的核心操作 此時節點指向隔了乙個節點的節點
node = clonode.next
clonode.next = node.next
clonode = node #下乙個節點的操作
這個操作其實就是將兩個鍊錶順次全都拆分出來,乙個很關鍵的步驟 phead = phead.next 如果沒有這句話,最後得到的phead就是原鍊錶的開頭了。
總程式如下:
# -*- coding:utf-8 -*-# class randomlistnode:
# def __init__(self, x):
# self.label = x
# self.next = none
# self.random = none
class solution:
# 返回 randomlistnode
def clone(self, phead):
# write code here
if not phead:
return phead
clonode = phead
while clonode:
node = randomlistnode(clonode.label)
node.next = clonode.next
clonode.next = node
clonode = node.next
clonode = phead
while clonode:
node = clonode.next
if clonode.random:
node.random = clonode.random.next
clonode = node.next
clonode = phead
phead = phead.next
while clonode.next:
node = clonode.next
clonode.next = node.next
clonode = node
return phead
鍊錶 複雜鍊錶的複製
問題描述 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。結點的定義如下 struct randomlistnod...
35 複雜鍊錶的複製 python
題目 請實現乙個函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個m pnext指標指向下乙個節點,還有乙個m psibling指標指向鍊錶中的任意節點或者nullptr。def complex list clone head node node if not head return none...
複雜鍊錶複製
複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...