王道数据结构p40.二.0
设计一个递归算法,删除不带头结点的单链表L中的所有值为x的结点。
解:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点,显然f(L->next,x)的功能是删除以L->next为首结点指针的单链表中所有值等于x的结点。由此,可以推出递归模型如下。
终止条件:f(L,x)≡不做任何事情; 若L为空表
递归主体:f(L,x)≡删除*L结点;f(L->next,x); 若L->data == x
f(L,x)≡f(L->next,x); 其他情况
代码如下:
void Del_X3(Linklist &L,ElemType x){
//递归实现在单链表L中删除值为X的结点
LNode *p;
if(L == NULL)
return ;
if(L->data == x){
p=L;
L=L->next;
free(p);
Del_X_3(L,x); //递归调用
}
else //若L所指结点的值不为x
Del_X_3(L->next, x); //递归调用
}
问题:free是否会导致断链
由于是递归原因,当L->data==x时,L=L->next会改变上一层中L的指向,free(p)可以成功的删除节点而不会导致断链
只要删除结点时使用到了else中的参数传递,该代码能够成功执行删除操作,不会导致断链。