题目:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。要求复制出一个完全相同的链表。
测试用例:
输入:{1, 2, 3, 3, 1, 2}(前半部分是链表元素,后半部分是random指针指向的结点,random可指向空指针)
输出:{1, 2, 3, 3, 1, 2}
思路:
对于一个结点x,我们在它之后的位置再插入一个有相同值的结点(记为new_x) 。然后再一次遍历,把new_x的random指针指向x.random.next(不能指向x.random,因为我们是要对原来的链表进行复制,必须指向和x.random具有相同值的新结点)。最后把这些新建立的指针分离出来。
代码:
# -*- 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 None
cur = pHead
while cur:
nxt = cur.next
cur.next = RandomListNode(cur.label)
cur.next.next = nxt
cur = nxt
cur = pHead
while cur:
curcopy = cur.next
if cur.random: #注意空指针判定
curcopy.random = cur.random.next
else:
curcopy.random = None
cur = curcopy.next
newhead = pHead.next
cur = pHead
while cur:
nxt = cur.next.next
curcopy = cur.next
if nxt: #注意空指针判定
curcopy.next = nxt.next
else:
curcopy.next = None
cur.next = nxt
cur = nxt
return newhead