剑指Offer-复制复杂链表

//复杂链表的赋值
#include <iostream>
using namespace std;
struct comListNode
{
    int val;
    comListNode *next;
    comListNode *sib;
};
//第一步,复制原始链表的任一结点N,并创建新结点N‘,再把新结点N'连接到结点N后面
void CloneNode(comListNode *phead)
{
    comListNode *pnode=phead;
    while(pnode!=NULL)
    {
        comListNode *pcloned=new comListNode();
        pcloned->val=pnode->val;//复制结点的值与原结点值相等
        pclones->sib=NULL;
        pcloned->next=pnode->next;//将复制结点插入原结点后面
        pnode->next=pcloned;

        pnode=pcloned->next;
    }
}

//设置复制链表的sib
//复制结点的sib,是原结点的sib的下一结点
void Connectsib(comListNode *phead)
{
  comListNode *pnode=phead;
  while(pnode!=NULL)
  {
      comListNode *pcloned=pnode->next;
      if(pnode->sib!=NULL)
      {
          pcloned->sib=pnode->sib->next;
      }
      pnode=pcloned->next;
  }
}

//长链表的拆分
comListNode* ReconnectNode(comListNode *phead)
{
    comListNode *pclonedhead=NULL;
    comListNode *pcloned=NULL;
    comListNode *pnode=phead;
    if(pnode!=NULL)
    {
        pclonedhead=pcloned=pnode->next;//复制链表头结点
        pnode->next=pcloned->next;//原链表的下一结点
        pnode=pcloned->next;//更新原链表结点
    }
    while(pnode!=NULL)
    {
        pcloned->next=pnode->next;
        pcloned=pcloned->next;//更新新链表结点

        pnode->next=pcloned->next;
        pnode=pcloned->next;
    }
}
comListNode* Clone(comListNode* phead)
{
    CloneNode(phead);
    Connectsib(phead);
    return ReconnectNode(phead);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值