递归算法删除不带头节点单链表L中所有值为x的节点
1.算法思路
设f(L,x)的功能是删除以L为首节点指针的单链表中所有值为x的节点
- 终止条件:f(L,x) = 不做任何事情; 若L为空表
- 递归主题:f(L,x) = 删除*L节点;f(L->next,x); 若L->data == x
- f(L,x) = f(L->next,x); 其他情况
2.函数代码
void Del_x(LinkList $L,ElemType x){
//递归算法删除不带头节点单链表L中所有值为x的节点
LNode *p; //使用p指针指向待删除节点
if(L == NULL) //递归终止条件
return ;
if(L->data ==x){ //若L所指节点的值为x
p = L; //删除*L,并让L指向下一个节点
L = L->next;
free(p);
Del_x(L,x); //调用递归
}
else //若L的值不为x
Del_x(L->next,x);
}
3.图解+时间复杂度
- 算法需要借助一个递归的工作栈,深度为O(n),时间复杂度为O(n)。
free()函数会释放p指针所指节点申请的内存,该指针变为野指针。