2025年4月28日 星期一 乙巳(蛇)年 正月廿九 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

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

时间:01-03来源:作者:点击数:62

问题描述:

设计一个递归算法,删除不带头结点的单链表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_X_3 (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_3(L,x) ; //递归调用
  • }else //若L所指结点的值不为x
  • Del_X_3 (L->next, x) ; //递归调用
  • }

算法需要借助一个递归工作栈,深度为O(n),时间复杂度为O(n)。有读者认为直接free掉p结点会造成断链,实际上因为L为引用,是直接对原链表进行操作,因此不会断链。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门