最近复习到数据结构的链表部分,做到了一道题,题目为设计一个递归算法,删除不带头结点的单链表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值的更新