复杂链表的复制
复杂链表定义: 在复杂链表中,每个节点除了有一个_pnext指针指向 下一个结点外,还有一个_pSibling指向链表的任意节点或者NULL.(如下图所示)
备注:橙黄箭头代表_pnext指针,深蓝箭头代表_pSibling指针。
任务一:创建复杂链表
//节点定义
struct ComplexListNode
{
ComplexListNode(int x)
:_value(x)
,_pnext(NULL)
,_pSibling(NULL)
{}
int _value;
ComplexListNode *_pnext;
ComplexListNode *_pSibling;
}*Phead;
//复杂链表简单创建
ComplexListNode* CreatList()
{
ComplexListNode* head=new ComplexListNode(0);
ComplexListNode* node1=new ComplexListNode(1);
ComplexListNode* node2=new ComplexListNode(3);
ComplexListNode* node3=new ComplexListNode(5);
ComplexListNode* node4=new ComplexListNode(7);
ComplexListNode* node5=new ComplexListNode(9);
head=node1;
node1->_pnext=node2;
node2->_pnext=node3;
node3->_pnext=node4;
node4->_pnext=node5;
node5->_pnext=NULL;
node1->_pSibling=node3;
node2->_pSibling=node5;
node3->_pSibling=NULL;
node4->_pSibling=node2;
node5->_pSibling=NULL;
return head;
}
任务二:创建新节点
思路:复制原来链表每个节点,并把每个新节点用_pnext指针将旧节点连接;如果原来链表的一个节点的_pSibling指向原链表某一个节点,则它对应的新节点的_pSibling指向某一节点的下一个节点。
//复制_pnext域
ComplexListNode* CopyNodes(ComplexListNode* Phead)
{
ComplexListNode* cur=Phead;
while(cur)
{
ComplexListNode* copynode=new ComplexListNode(0);
copynode->_value=cur->_value;
if(cur->_pnext!=NULL)
{
copynode->_pnext=cur->_pnext;
}
else
{
copynode->_pnext=NULL;
}
copynode->_pSibling=NULL;
cur->_pnext=copynode;
cur=copynode->_pnext;
}
return Phead;
}
//复制_pSibling域
ComplexListNode* CopySibNodes(ComplexListNode* Phead)
{
ComplexListNode* cur=Phead;
while(cur)
{
ComplexListNode* copynode=cur->_pnext;
if(cur->_pSibling)
{
copynode->_pSibling=cur->_pSibling->_pnext;
}
cur=copynode->_pnext;
}
return Phead;
}
任务三:长链表变成两个链表
ComplexListNode* CopyComplexList(ComplexListNode* Phead)
{
ComplexListNode* cur=Phead;
ComplexListNode* copynode=new ComplexListNode(0);
ComplexListNode* Phead1=new ComplexListNode(0);
if(cur!=NULL)
{
Phead1=copynode=cur->_pnext;
cur->_pnext=copynode->_pnext;
cur=cur->_pnext;
}
while(cur)
{
copynode->_pnext=cur->_pnext; //关键1步
copynode=copynode->_pnext;
cur->_pnext=copynode->_pnext;
cur=cur->_pnext;
}
return Phead1;
}
就这样,复杂链表的复制完成了,小编要和大家说再见了!