【题目描述】
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
【解题思路】
整个过程分为三个子过程:
- 在每个节点后,复制一个新的节点,连成一个链表,在此过程中,新节点的random值先置为空;
- 这一步为random指针赋值,新节点的random指针所指向的节点就是原节点random指针所指向节点的下一个节点(这两个节点,后一个也是由前一个复制而来的);
- 把复制后的链表拆分成两个链表,一个是原始链表,另一个就是复制后的新链表。
用Python实现的代码如下:
# -*- 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
# 在每个节点后,复制一个新的节点,连成一个链表,在此过程中,新节点的random值先置为空
pNode = pHead
while pNode:
copy_node = RandomListNode(pNode.label)
copy_node.next = pNode.next
pNode.next = copy_node
pNode = copy_node.next
# 这一步为random指针赋值,新节点的random指针所指向的节点就是原节点random指针所指向节点的下一个节点(这两个节点,后一个也是由前一个复制而来的);
pCopy = pHead
while pCopy:
pClone = pCopy.next
if pCopy.random:
pClone.random = pCopy.random.next
pCopy = pClone.next
# 把复制后的链表拆分成两个链表,一个是原始链表,另一个就是复制后的新链表。
p_ori = pHead
p_new = pHead.next
head = p_new
while p_ori:
p_ori.next = p_new.next
p_ori = p_new.next
if p_ori:
p_new.next = p_ori.next
p_new = p_ori.next
return head