给出题目:设计一个递归算法,删除不带头节点的单链表L中所有值为x的节点
//(1)删除不带头节点L中所有值为x的节点
void Del_x_1(LinkList &L, ElemType x)
{
LNode *p;
if(L == NULL)
return;
if(L->data == x)
{
p = L;
L = L->next;
free(p); //注意:此处不会断链
Del_x_1(L,x);
}
else
Del_x_1(L->next,x);
}
此处的疑惑是之前单链表的删除节点,需要找到其前驱节点来改变指针,再free掉。而此处递归没有找前驱为什么不断链?
其实,L2 == L1->next(即L1->next为结点1的next域)
而执行L2= L2->next现在就相当于把2的next域指向了3。(L1->next = L2->next。所以,我们在这个删除的过程中还是隐含的知道了要删除结点的前驱结点)