递归实现删除单链表中值为x的结点以及对“不断链”的解释

题目

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



代码实现

void Del_X(Linklist &L,ElemType x ){
	LNode *p;             //用p来存储待删除的结点的指针
	if(L==NULL)           //递归的出口
		return;
	if(L->data==x)        //找到待删除结点  
	{
		p=L;		      //删除*L结点,并将L指向下一结点
		L=L->next;
		free(p);
		Del_X(L,x);       //递归调用
		
	}
	else{
		Del_X(L->next,x); //若结点的值不为x,则继续递归调用
	}
}



对于“不断链”的解释

设有不带头结点的单链表,已知第一个结点的指针L:
在这里插入图片描述

正常情况下单链表删除值为x结点的方法应该是:

p=L->next;   
L->next=p->next;
free(p);

结合上例和代码,可能会让人感觉最上面的递归代码好像 少了把待删除结点 *p前后的结点*L,*q连接起来的操作,即让人感觉 “断链” 了。

下面对删除结点这一过程进行分析:第一次执行Del_X(L,x),由于结点值为a,执行Del_X(L->next,x); 此时的 L->next就是值为x结点的指针,进入到递归函数中,由于值为x,因此执行

		p=L;		 
		L=L->next;
		free(p);
		Del_X(L,x);     
		

由于此次递归输入的形参的实际值是L->next,所以在这次递归中的函数出现的 L实际上是L->next,所以L=L->next 实际上是L->next=L->next->next,即越过了 *p结点将 *L, *q结点连上了,再把 *p结点删除。
所以说链表没断。。

  • 29
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值