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

删除带头结点的单链表L中所有值为x的节点并释放其空间

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

问题描述:

在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。

问题解答:

解法一:用p从头至尾扫描单链表,pre指向*p结点的前驱。若p所指结点的值为x,则删除,并让p移向下一个结点,否则让pre、p指针同步后移一个结点。

本题代码如下:

  • void Del_X_1(Linklist &L, ElemType x){
  • //L为带头的单链表,本算法删除L中所有值为x的结点
  • LNode *p=L->next, *pre=L, *q; //置 p 和 pre 的初始值
  • while(p!=NULL){
  • if(p->data==x){
  • q=p; //q指向该结点
  • p=p->next;
  • pre->next=p; //删除*q 结点
  • free(q); //释放 *q结点的空间
  • }else{ //否则,pre和p同步后移
  • pre=p;
  • p=p->next;
  • } //else
  • } //while
  • }

本算法是在无序单链表中删除满足某种条件的所有结点,这里的条件是结点的值为x。实际上,这个条件是可以任意指定的,只要修改if条件即可,比如,我们要求删除值介于 mink和maxk之间的所有结点,则只需将if语句修改为if(p->data>mink &&p->data<maxk)。

解法二:用尾插法建立单链表。用p指针扫描L的所有结点,当其值不为x时将其链接到L之后,否则将其释放。

本题代码如下:

  • void Del_X_2(Linklist &L, ElemType x){
  • //L为带头的单链表,本算法删除L中所有值为x的结点
  • LNode *p=3->next, *r=L, *q; //r指向尾结点,其切值为头结点
  • while(p!=NULL){
  • if (p->data!=x) { //*p结点值不为x时将其链接到L尾部
  • r->next=p;
  • r=p;
  • p=p->next; //继续扫描
  • }else{ //*p结点值为x时将其释放
  • q=p;
  • p=p->next; //继续扫描
  • free(q); //释放空间
  • }
  • }//while
  • r->next=NULL; //插入结束后置尾结点指针为NULL
  • }

上述两个算法扫描一遍链表,时间复杂度为O(n),空间复杂度为O(1)。

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