关于删除不带头结点的单链表L中所有值为X的结点问题的疑点

原问题如下:

    设计一个递归算法,删除不带头结点的单链表L中所有值为X的结点。

答案使用递归法,算法如下:

void Del_X(LinkList &L, ElemType x){
	LNode *P;
	if(L==NULL){
		return;
	}
	if(L->data==X){
		P=L;
		L=L->next;
		free(p);
		Del_X(L, x);
	}
	else{
		Del_X(L->next, x);
	}
}

该算法需要借助一个递归工作栈,深度为O(n),十几块复杂度为O(n)。

而疑点在于free(p);这条语句,有人认为该语句会造成断链,但实际上由于函数的递归调用时,总会在函数调用前把现有函数的变量压入堆栈进行保存,所以这条语句相当于:

L->next=L->next->next;

这样实际上并没有造成断链。

你可能感兴趣的:(考研)