标签:复杂链表的复制
复制一个复杂链表,在复杂链表中,每个节点除了有个m_next指针外,还有一个m_psibing指针,它指向链表中的任意节点或者为NULL。
这个问题给人第一印象挺难的,不过,我们可以分成几步就可以将它搞定:
(一)复制原始链表的每一个节点N,并且把新节点连接到旧节点的后边
(二)设置复制出来的新节点的m_psibing,假设原来链表上的N的m_psibing指向节点s,则复制出来的节点指向m_psibing->m_next
(三)把长链表拆分成两个相等的短链表
源代码如下:
#include<iostream>
#include<assert.h>
using namespace std;
struct Node
{
Node * m_next;
Node * m_psibing;
int value;
};
//1复制原始链表上的任意节点N,再把复制好的节点连在原来节点的后边
void CloneNodes( Node* pHead)
{
assert(pHead);
Node* cur=pHead;
while(cur!=NULL)
{
Node* pclone=new Node();
pclone->value=cur->value;
pclone->m_next=cur->m_next;
pclone->m_psibing=NULL;
cur->m_next=pclone;
cur=pclone->m_next;
}
}
//2如果原始链表的m_psibing,指向L,则复制后的节点也指向L
void ClonePsibingNode(Node* pHead)
{
assert(pHead);
Node* cur=pHead;
while(cur!=NULL)
{
Node* pclone=cur->m_next;
while(cur->m_psibing !=NULL)
{
pclone->m_psibing =cur->m_psibing->m_next;
}
cur=pclone->m_next ;
}
}
//3拆分链表,把刚才复制好的链表拆分成两个即可达到复制的效果
Node* ReconnectNodes(Node* pHead)
{
assert(pHead);
Node* cur=pHead;
Node*pcloneHead=cur->m_next ;
Node* pclone=cur->m_next ;
cur->m_next =pclone->m_next;
cur=cur->m_next ;
while(cur!=NULL)
{
pclone->m_next =cur->m_next ;
pclone=pclone->m_next;
cur->m_next =pclone->m_next ;
cur=cur->m_next ;
}
return pcloneHead;
}
//主函数
Node * Clone(Node* pHead)
{
assert(pHead);
CloneNodes(pHead);
ClonePsibingNode(pHead);
return ReconnectNodes(pHead);
}
int main()
{
Node* p1=new Node();
Node* p2=new Node();
Node* p3=new Node();
Node* p4=new Node();
p1->m_next =p2;
p2->m_next =p3;
p3->m_next =p4;
p4->m_next =NULL;
p1->value =1;
p2->value =2;
p1->value =3;
p2->value =4;
p1->m_psibing=p3;
p4->m_psibing=p2;
p2->m_psibing =NULL;
p3->m_psibing =NULL;
Node*pcloneHead=Clone(p1);
cout<<pcloneHead<<endl;
getchar();
return 0;
}标签:复杂链表的复制
原文地址:http://10808695.blog.51cto.com/10798695/1764247