复杂链表的复制

题目:实现一个函数复制复杂链表,在复杂链表中,每个节点除了有一个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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值