您的位置:首页 > Web前端

剑指Offer-复制复杂链表

2016-08-22 11:00 471 查看
//复杂链表的赋值
#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: