题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路:
1,如果链表为空链表,则返回本身即可。
2,如果链表非空的情况:如果没有特殊指针,则只需要复制。如果含有特殊指针,需要技巧。
思路1:
首先复制原来的链表,顺次连接形成新的链表。
// A code block
cloNode = pHead
while cloNode:
#完成第一步的核心操作
node = RandomListNode(cloNode.label)
node.next = cloNode.next
cloNode.next = node
cloNode = node.next #下一次操作
第二步,利用原节点的random指向,来用复制的相应节点的random
// A code block
cloNode = pHead
while cloNode:
node = cloNode.next #指向复制的结点
if cloNode.random: #如果原节点有特殊指针
node.random = cloNode.random.next #则复制的节点的特殊指针指向原节点的特殊指针指向的下一个值 看图更好理解一些
cloNode = node.next
最后一步,将复制好的链表拆分出来,或者说将 偶数位的节点重新拆分合成新的链表,得到的就是复制的链表
// A code block
cloNode = pHead
pHead = pHead.next
while cloNode.next:
#完成第三步的核心操作 此时节点指向隔了一个节点的节点
node = cloNode.next
cloNode.next = node.next
cloNode = node #下一个节点的操作
总程序如下:
// An highlighted block
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
#######第二步,利用原节点的random指向,来用复制的相应节点的random######
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
Python实现2:
// An highlighted block
def iter_node(root):
while root:
yield root
root = root.next
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
mem = dict()
for i,n in enumerate(iter_node(pHead)):
mem[id(n)] = i
lst = [RandomListNode(n.label) for n in iter_node(pHead)]
for t,f in zip(iter_node(pHead),lst):
if t.next:
f.next = lst[mem[id(t.next)]]
if t.random:
f.random = lst[mem[id(t.random)]]
return lst[0] if lst else None
https://blog.csdn.net/besmarterbestronger/article/details/96975588