题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解答如下:
环境:python 2.7.3
本题的思路是:
1.用pTmp指针遍历原链表的每一个节点,复制原链表的每个节点并作为对应原节点的下一个节点,显示在下图就是复制红色节点为黄色节点,放在原节点的后边。
2.第二步要做的是修改每一个新节点(黄色节点)的random指针的指向,这里可以观察到如下关系:(注意如果一个节点random指针指向空,则跳过这个节点)
pTmp.next.random = pTmp.random.next
那么通过移动原链表的临时指针pTmp,就可以修改每个黄色节点的random指针指向。
3.第三步就是分离两个链表,用newHead指向新链表的表头,这里再为新链表建立临时指针pNewTemp,通过移动两个临时指针来断开新旧节点连接,然后建立新连接。最后返回新链表的表头指针newHead。
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
#复制一个一样的node,添加到之前链表的每个节点后面。
if pHead == None:
return None
pTmp = pHead
while pTmp:
node = RandomListNode(pTmp.label)
node.next = pTmp.next
pTmp.next = node
pTmp = node.next
#实现新节点node的random指向
pTmp = pHead
while pTmp:
if pTmp.random:
pTmp.next.random = pTmp.random.next
pTmp = pTmp.next.next
#断开原来的每个节点和新node之间的连接
pTmp = pHead
newHead = pHead.next
pNewTmp = pHead.next
while pTmp:
pTmp.next = pTmp.next.next
if pNewTmp.next:
pNewTmp.next = pNewTmp.next.next
pNewTmp = pNewTmp.next
pTmp = pTmp.next
return newHead