1、问题描述
请实现一个函数复制复杂链表。在复杂链表中,每个节点除了有一个m_next指针指向下一个节点处,还有一个m_pSibling指针指向链表中的任意节点或者NULL。
2、解题思路
- 边界条件:复杂链表头节点为空指针。
- 思路1:最简单的方法是把复制过程分成两步:第一步是复制原始链表中的每一个节点,并用m_next将这些节点连接起来;第二步是设置每一个节点的m_pSbling。这种方法的时间复杂度为 O ( n 2 ) O(n^{2}) O(n2)。
- 思路2:第二种方法分为3步:
- (1)第一步是根据原始链表中的每一个节点N创建N’,然后把N’连接在N的后面。链表经过第一步后新的的结构如下图所示:
- (2)第二步是设置复制出来节点的m_pSbling。假设原始链表中的节点N的m_pSbling指向节点S,其复制出来的对应节点N’是N的m_next指向的节点,那么N’的m_pSibliing指向的节点S’是S的m_pSibling所指向的节点。例如上图,A的m_next是A’,C的m_next是C’,A的m_pSbling是C,那么A’的m_pSbling就是C。设置m_pSbling之后的链表如下所示:
(3)第三步是把这个长链表拆成两个短链表。将奇数位置的节点连接起来就是原始链表;将偶数位置的节点连接起来就是复制后的链表。
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
self.CloneNode(pHead)
self.ConnectSiblingNode(pHead)
pCloneNode = self.ReconnectNode(pHead)
return pCloneNode
# 复制原链表的每一节点N,创建N',并将N'连接到N节点的后面
def CloneNode(self,pHead):
pNode = pHead
while pNode != None:
pCloneNode = RandomListNode(pNode.label)
pCloneNode.next = pNode.next
pNode.next = pCloneNode
pNode = pCloneNode.next
#设置复制出来的节点的sibling
def ConnectSiblingNode(self, pHead):
pNode = pHead
while pNode != None:
pCloneNode = pNode.next
if pCloneNode != None:
if pNode.random != None:
pCloneNode.random = pNode.random.next
pNode = pCloneNode.next
#将长链表拆成两个链表
def ReconnectNode(self,pHead):
pNode = pHead
pCloneHead = None
pCloneNode = None
if pNode != None:
pCloneHead = pNode.next
pCloneNode = pCloneHead
pNode.next = pCloneNode.next
pNode = pNode.next
while pNode != None:
pCloneNode.next = pNode.next
pCloneNode = pCloneNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
return pCloneHead