双向链表
来源:互联网 发布:成濑川奈留 知乎 编辑:程序博客网 时间:2024/05/22 06:40
有双向循环链表结点:(华为面试题)
typedef struct node
{
int date;
struct node *front,*next;
}_Node;
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两上链表中date值相同的结点删除
参考算法:
1.取出A的一个元素d
2.收集B中有相同元素d的结点到垃圾箱,并从B里删除
3.收集A中有相同元素d的结点到垃圾箱,并从A里删除
4.删除垃圾箱中的所有元素
5.A链的指针指向下一个
6.重复1~5,直到A链循环到头了
注意的是第3步,在2步执行后垃圾箱不为空时才执行。
上述算法还可以做一点点优化:
1.加入两个变量cA, cB,分别记录当前A中和B中的元素个数
每次从较长者中取出一个元素来,先从较小者中找起
若没有,则不必在较长者中浪费时间了
#include<iostream.h> ?
struct NODE
{
int date;
NODE *front,*next;
};
void redel(NODE *&ahead,NODE *&bhead)
{
int boy=0;
NODE *pa=ahead,*pb=bhead,*paa,*paaa,*paaaa,*pbb;
while(pa->next!=ahead)
{
int boys=pa->date; //取pa中一个值
paaaa=pa;
paa=pa;
pb=bhead;
while(pb->next!=bhead)
{
if(boys==pb->date) //如果pa,pb中有值相同
{
cout<<endl;
cout<<"delete B:"<<paa->date<<" ";
if(pb==bhead)
{
boy=1;
pb->front->next=pb->next;
pb->next->front=pb->front;
bhead=bhead->next;
pbb=pb;
pb=pb->next;
delete pbb;
}
else
{
boy=1;
pb->front->next=pb->next;
pb->next->front=pb->front;
pbb=pb;
pb=pb->next;
delete pbb;
}
}
else
pb=pb->next;
}
while(paa->next!=ahead && boy==1)
{
if(paa->date==boys)
{
cout<<"delete A:"<<paa->date<<" ";
if(paa==pa)
{
pa=pa->next;
ahead=pa;
paa->front->next=paa->next;
paa->next->front=paa->front;
paaa=paa;
paa=paa->next;
delete paaa;
}
else
{
paa->front->next=paa->next;
paa->next->front=paa->front;
paaa=paa;
paa=paa->next;
delete paaa;
}
}
else
{
paa=paa->next;
}
}
boy=0;
if(paaaa==pa)
pa=pa->next;
}
cout<<endl;
}
int main()
{
NODE *A,*pHeadA,*B,*pHeadB;
A=new NODE;
B=new NODE;
pHeadA=A;
pHeadB=B;
for(int i=1;i<21;++i) //生成链表A,并赋初值!
{
A->date=i;
A->next=new NODE;
A->next->front=A;
A=A->next;
}
A=A->front;
delete A->next;
A->next=pHeadA;
pHeadA->front=A;
for(int i=1;i<33;i+=2) //生成链表B,并赋初值!
{
B->date=i;
B->next=new NODE;
B->next->front=B;
B=B->next;
}
B=B->front;
delete B->next;
B->next=pHeadB;
pHeadB->front=B;
redel(pHeadA,pHeadB); //调用函数删除相同结点!
}
- SzNOI 双向约瑟夫(双向链表)
- 双向链表&&堆栈
- 双向链表
- 使用双向链表
- 双向链表
- 双向循环链表
- 双向循环链表
- 双向链表
- 实现双向链表
- 双向循环链表
- 建立双向链表
- 双向链表
- 双向链表
- 双向循环链表
- 双向链表
- 链表-双向链表
- 双向链表
- 双向动态链表
- 十进制转其他进制--优化方案
- hdu 1548 bfs 或 单向最短路
- 《有些事现在不做,一辈子都不会做了》(韩梅梅)
- JSP中的路径问题,重定向与转发
- 提高绩效辅导有效性的八大实战技巧<一>
- 双向链表
- 经典链表
- 字典树
- Struts1.x教程(二) Struts进阶使用
- c语言那些细节之a+1和&a+1的区别
- 面向对象的设计原则-类设计原则
- 跟踪内存分配与释放
- UI+Sql query 查询Lov对应的后台Sql
- 博弈知识汇总