25. 复杂链表的复制
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路
注意本题的要点在于,输出结果中不要返回参数中的节点引用,所以不能直接将参数节点返回结果,而是要通过遍历的方式建立拥有新的节点的新链表。
解题思路:
1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
3、拆分链表,将链表拆分为原链表和复制后的链表
思路图如下所示:
代码也分3步来解决这个问题。分别是:(要注意节点的next为空的情况)
第1次遍历,复制节点
第2次遍历,复制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 not pHead:
return pHead
# 第1次遍历,复制节点
head = pHead # 把参数复制到head中,免得后续操作影响pHead
while(head):
newNode = RandomListNode(head.label)
newNode.next = head.next
head.next = newNode
head = newNode.next
# 第2次遍历,复制random指针
head = pHead
while(head):
newNode = head.next
if head.random:
newNode.random = head.random.next
head = newNode.next
# 第3次遍历,拆分链表
head = pHead
newHead = head.next # newHead是新链表的表头指针,先固定下来
while(head):
newNode = head.next
head.next = newNode.next
head = newNode.next
if(head == None):
newNode.next = None
else:
newNode.next = head.next
return newHead
京公网安备 11010502036488号