引用在链表删除结点的巧妙用法

最近复习到数据结构的链表部分,做到了一道题,题目为设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。

在这里插入图片描述

在答案中,可以看到当删除结点时,是令L=L->next,随后直接free了p指针。猛然一看,可能就会很迷惑为什么没有更改删除结点前驱结点的next,直接就free了,这样不会造成断链吗?

但是大家仔细观察该函数的形参,第一个参数为引用类型,引用也就相当于我有一个物品a,我又给它起了个名字叫做b,本质上是一个东西,只是名字进行了改变。这样对于前驱结点的next赋值有什么用呢?

用处在于,在else语句中,在当前结点的data值不为x时,我们递归调用Del_X_3函数的时候,传递的参数是当前结点的next,也就是说,我们在这种情况下,所调用的实参&L,只是前驱结点的另一个名字而已。为了便于理解,我们暂且假设当前结点的名字为A,且A结点的data值不为x,下一个结点B的data值为x,所以在A结点执行else中递归调用Del_X_3函数的时候,我们将A->next作为参数,传入了函数,接着继续执行递归调用的函数,此时当前结点转换为B,由于B的data值前提中假设为x,所以执行if语句中的L=L->next语句,其实就是执行A->next=A->next->next=B->next,因为当前L的值就是A->next。这样就完成了对当前结点的前驱结点的next值的更新

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值