循环双链表的删除

来源:互联网 发布: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;}