输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
链表和二叉树一样,前后节点都有关系,因此可以利用递归来做。
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if pHead == None:
return None
# 新建一个链表的头结点
newhead = RandomListNode(pHead.label)
# 令头结点的random等于原来头节点的random
newhead.random = pHead.random
# 令头结点的next等于原来头结点的next (这一步可以省略,直接让newhead.next等于递归后的pHead.next)
newhead.next = pHead.next
# 递归处理newhead.next
newhead.next = self.Clone(pHead.next)
return newhead
不用递归的话,可以在之前链表的基础上挨个复制节点和它们之间的关系,最后江新旧链表剥离即可,可以通过下面三步来完成。
1.复制节点,并复制他们之间的next关系。这一步不用管新链表的random节点。
2.根据旧链表的random关系,建立新链表的random关系。
3.新旧链表剥离。
# -*- 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 pHead == None:
return None
# 第一步,复制链表
cur = pHead
while cur:
curnext = cur.next
tempNode = RandomListNode(cur.label)
tempNode.next = curnext
cur.next = tempNode
cur = curnext
# 第二步,复制random关系
cur = pHead
while cur:
currandom = cur.random
tempNode = cur.next
if currandom:
tempNode.random = currandom.next
cur = tempNode.next
# 第三步,分离新旧链表,新旧链表的唯一联系是next关系,把这个next关系剥离之后就可以了
cur = pHead
newhead = pHead.next # 返回新链表的头结点
while cur:
newnode = cur.next
curnext = newnode.next
if curnext:
cur.next = curnext
newnode.next = curnext.next
else:
cur.next = None
newnode.next = None
cur = curnext
return newhead