欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

递归删除链表中的指定元素x

程序员文章站 2022-03-22 10:09:09
...

/*
问题描述:递归删除链表中的x
说明:此处要注意的是,在递归删除x的时候,中间并没有产生断链。因为函数传递的是引用。
关于引用,这次又详细的查了一下。特说明如下:

其实引用,在教材上被解释成别名。就是给变量另起一个名字。从本质上说,其实并没有引用这回事,引用的内部实现过程还是利用指针来实现的。
比如说:int i; int &j = i; 然后我们就可以说j是i的引用了,在编译器编译的时候,一般来说,它会把上面的第二条语句翻译成这样,
int const *j = &i;然后在程序中所有用到j的地方都用*j来代替。只是对于我们来说,这个过程被屏蔽了。我们不用再去管j这个指针,使用时直接当成和i相似的变量就行。个人觉得普通的变量用引用没什么必要,在C++中更多的当成指针的引用来传递参数,使得在函数内部可以改变指针所指的对象,这个在链表中用的较多。其实在也可以用C语言的二重指针实现,可能是因为二重指针有点烦,易出错,所以C++才规定了引用这个东西,把引用给包装了起来。在深入一点,JAVA中连指针也没有了,应该是在C++的基础上用了更高层次的封装了吧。

*/

//删除x(普通方法)
void Delete_x(LinkList &L,int x)
{
    LNode *p = L,*q;

    while(p->next !=NULL)
    {
        q = p->next;
        if(x == q->data)
        {
            p->next = q->next;
            delete q;
        }
        else
            p = p->next;
    }
}
//递归删除元素x
void Del_xByRecursion(LinkList &L,int x)
{

    LNode *p;
    if(L == NULL)       //如果为空,则返回
        return ;

    if(L->data == x)    //如果L指向x,则删除当前指针
    {
        p = L;
        L = L->next;        //注意此处并没有造成短链,因为函数传递的是引用的缘故

        delete p;
        Del_xByRecursion(L,x);
    }
    else
        Del_xByRecursion(L->next,x);
}

附:

//测试引用的功能代码
  LinkList L = new LNode;
    L->data = 3;
    LinkList p1 = new LNode;
    p1->data = 4;
    LinkList p2 = new LNode;
    p2->data = 5;

    L->next = p1;
    p1->next = p2;
    p2->next = NULL;

    cout<<"sizeof(*L)"<<sizeof(LNode)<<endl;
    cout<<"L:"<<L<<endl;
    cout<<"&L->data:"<<&(L->data)<<endl;
    cout<<"&L->next:"<<&(L->next)<<endl;
    cout<<"L->next:"<<L->next<<endl;


    LinkList &L2 = L->next;

    cout<<"L2->data:"<<L2->data<<endl;
    p1 = L2;
    L2 = L2->next;
    delete p1;

    //输出链表中的元素
    while(L != NULL)
    {
        cout<<L->data<<" ";
        L = L->next;
    }
    cout<<endl;