题目
解决代码及点评
/*
复杂链表的拷贝,现在有一个复杂链表,完成一个clone函数拷贝一个链表
复杂链表是指
struct Node
{
struct Node* _next;
struct Node* _sibling; // sibling指向链表中任意一个节点,或者为NULL
int _data;
};
这道题困难之处在于复制sibling节点,因为按照普通思维,复制好普通链表之后
恢复sibling节点指向非常困难
解决办法:
就地复制,再拆分
比如 原始链表是 a->b->c->d 先就地复制 a->a1->b->b1->c->c1->d->d1
就地复制后,sibling指针也很好确定,就是原来那个节点的next,放置好sibling之后,再进行拆分即可
*/
#include <stdio.h>
#include <stdlib.h>
#include "iostream"
using namespace std;
typedef struct link
{
char id;
struct link *pnext;
struct link *pSibling;
} *plink,link;
// 创建链表
plink creat()
{
plink la,lb,lc,ld,le;
la = (plink)malloc(sizeof(link));
lb = (plink)malloc(sizeof(link));
lc = (plink)malloc(sizeof(link));
ld = (plink)malloc(sizeof(link));
le = (plink)malloc(sizeof(link));
la->pnext=lb;
la->pSibling=lc;
la->id='a';
lb->pnext=lc;
lb->pSibling=ld;
lb->id='b';
lc->pnext=ld;
lc->pSibling=NULL;
lc->id='c';
ld->pnext=le;
ld->pSibling=la;
ld->id='d';
le->pnext=NULL;
le->pSibling=NULL;
le->id='e';
return la;
}
plink copy(plink l)
{
plink head2=l;
// 就地复制
while(head2!=NULL)
{
plink temp;
temp = (plink)malloc(sizeof(link));
temp->id=head2->id;
temp->pnext=head2->pnext;
head2->pnext=temp;
head2=temp->pnext;
}
head2=l;
plink headt=l->pnext;
// 设置sibling
while(head2->pnext->pnext!=NULL)
{
if (head2->pSibling!=NULL)
{
headt->pSibling=head2->pSibling->pnext;
}
headt=headt->pnext->pnext;
head2=head2->pnext->pnext;
}
// 拆分链表
headt=l->pnext;
plink l2=headt;
cout<<headt->id<<"->";
while(headt->pnext->pnext->pnext!=NULL)
{
headt->pnext=headt->pnext->pnext;
headt=headt->pnext;
cout<<headt->id<<"->";
}
cout<<headt->pnext->id<<"->";
return l2;
}
// 主函数
int main()
{
plink l;
l = creat();
plink l2;
l2=copy(l);
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果