题目:实现一个函数复制复杂链表,在复杂链表中,每个节点除了有一个next指针指向下一个节点之外,还有一个sibling指向链表中的任意节点或者NULL。
solution1:先重建有next指针连接的原始链表,再对重建后的链表建立sibling指针的建立。寻找每个节点的slibing指向的节点都是从头节点开始遍历单链表直到找到为止,每个节点的寻找时间复杂度是o(n),因此,该方法的时间复杂度是o(n2)。
solution2:第一步:根据原始链表的每个节点N创建对应的节点N‘,并把N‘连接在N的后面。
void CloneNodes(ComplexListNode * Head)
{
if(Head==NULL)
return;
ComplexListNode * Pnode=Head;
while(Pnode!=NULL)
{
ComplexListNode* CloneNnode=new ComplexListNode();
CloneNode->value=Pnode->value;
CloneNode->next=Pnode->next;
CloneNode->slibling=NULL;
Pnode->next=CloneNode;
Pnode=CloneNode->next;
}
}
第二步:原始链表中每个节点的slibling连接的节点s,在新的链表中与之对应的s'即是s的后面一个节点。这样就很容易找到s‘并在新的链表中建立它.
void ConnectSliblingNode(ComplexListNode * Head)
{
if(Head==NULL)
return;
ComplexListNode * Pnode=Head;
while(Pnode!=NULL)
{
ComplexListNode * PCloneNode=Pnode->next;
if(Pnode->slibling!=NULL)
{PCloneNode->slibling=Pnode->slibling->next;}
Pnode=PCloneNode->next;
}
}
第三步:将上面两步中建立的链表分开,单数节点与偶数节点分开,单数节点组成的链表是原始链表,偶数节点组成的链表是新的链表。
ComplexListNode * ReconnectNodes(ComplexListNode * Head)
{
if(Head==NULL)
return;
ComplexListNode * CloneNodeHead=Head->next;
ComplexListNode * pNode=Head;
ComplexListNode * pCloneNode=Head->next;
while(pNode!=NULL&&pCloneNode!=NULL)
{
pNode->next=pCloneNode->next;
pCloneNode->next=pCloneNode->next->nezt;
pNode=pCloneNode->next;
pCloneNode=pNode->next;
}
return CloneNodeHead;
}
最后把前三步合起来,就是整个复杂链表的复制过程。
ComplexListNode * Clone(ComplexListNode * Head)
{
CloneNodes(Head);
ConnectSliblingNode(Head);
ReconnectNodes(Head);
}