循环双链表的删除
来源:互联网 发布:mac剪切文件夹 编辑:程序博客网 时间:2024/06/01 08:20
【问题】 已知一个循环双链表,p指向第一个元素值为x的结点,设计一个算法从该循环双链表中删除*p结点。
【分析】循环双链表在处理的时候注意两点:
1.删除的是头结点的时候,要处理边界条件
2.怎么判断是否完成一次链表的遍历
#include <iostream>using namespace std;struct doubleLink{ doubleLink(int x) { value=x; next=NULL; pre=NULL; } int value; doubleLink *next; doubleLink *pre;};//打印链表函数void showLink(doubleLink *root){ doubleLink *pointer=root;//存储链表的开头位置 if(pointer==NULL)//链表若为空直接返回 return; do { cout<<pointer->value<<" "; pointer=pointer->next; } while(pointer!=root);//链表不为空时候 //链表至少有一个结点,打印其value //再判断是否回到链表的开头}doubleLink* deleteNode(doubleLink *root,doubleLink *deleted){ deleted->pre->next=deleted->next; deleted->next->pre=deleted->pre; //完成链表的重构 //下面处理一些特殊情况 //1.如果被删除的结点是链表的首节点 if(root==deleted) { //1.1 若链表除首节点以外还有其他结点 if(root->next!=root) { doubleLink *temp=root->next; delete deleted; return temp; } //1.2若链表只有一个首节点 else return NULL; } //2.如果删除的不是首节点,那么直接删除即可 else { delete deleted; return root; }}int main(){ doubleLink *root=NULL; doubleLink *L0=new doubleLink(0); doubleLink *L1=new doubleLink(1); doubleLink *L2=new doubleLink(2); root=L0; L0->next=L1; L0->pre=L2; L1->next=L2; L1->pre=L0; L2->next=L0; L2->pre=L1; cout<<"初始化的链表为:"; showLink(root); cout<<endl<<"删除该结点之后的链表为:"; root=deleteNode(root,L0); showLink(root); cout<<endl<<"删除该结点之后的链表为:"; root=deleteNode(root,L1); showLink(root); cout<<endl<<"删除该结点之后的链表为:"; root=deleteNode(root,L2); showLink(root); return 0;}
阅读全文
0 0
- 循环双链表的删除
- 循环双链表的删除、插入、显示
- 纠结的循环中删除
- 关于vector的循环删除
- python循环删除的陷阱
- vector循环删除 的 操作方法
- 循环删除LISTBOX的项目
- 删除无限循环的文件夹。
- C语言:循环双链表的创建,插入,删除
- 循环双链表删除第一个值为x的结点
- 双链表的创建,求长,插入,删除,打印,释放(循环和非循环)
- 双向循环链表的删除
- 循环结点的前驱删除操作
- 关于循环删除某元素的方法
- for循环中删除精灵的处理
- 循环list删除相同的数据
- 双向循环链表的插入删除
- 删除双向循环列表的共同节点
- Dapper-一个简单的.Net对象映射器
- DFS子集
- 使用git来连接mysql
- Linux C命名管道实现进程间通信
- xshell连接ubuntu虚拟机(NAT模式)
- 循环双链表的删除
- 动态规划之矩阵连乘
- crontab定时任务
- C++中 引用符&,以int&举例说明
- SQL的函数---3th
- STM32 里 FWLib解释
- 机器学习入门(一)
- Glide 4.x之生命周期与Activity的绑定原理详解
- 10、springboot整合ssm