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

/*
问题描述:递归删除链表中的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;
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值