小白算法积累——单链表2#+不带头结点+按值删除

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

关键字:带头结点单链表L,按值删除,释放空间

思路1
本题为正常的删除操作,因为是单链表,所以需要借助两个指针,一个负责判断当前结点并执行删除操作,一个负责将前驱元素链接给后继元素(否则此单链表就断了)

需要变量:当前工作指针p,前驱工作指针pre

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;//
      free(q);//
    }
    else{
        pre=p;
        p=p->next;
    }
 

思路2
采用尾插法建立新单链表,新单链表=原单链表-所有值为x的结点。
1.遍历L,判断当前元素是否为x
a.data=x,正常删除操作(which means需要两个指针)
b.data!=x,连入新表

需要变量:L, 遍历指针p, 前驱指针r,删除指针q

void Del_X_2(Linklist &L,ElemType x){
//L为带头结点的单链表,本算法删除L中所有值为x的元素
  LNode*p=L->next,*r=L,*q;//r指向尾结点,其初值为头结点
  while(p!=NULL){
     if (p->data!=x){//*p结点值不为x时将其连接到L的表尾
         r->next=p;//这步需要和下面那种情况联合起来看,容易理解为啥要保证r是前驱指针
         r=p;
         p=p->next;//继续扫描
     }
     else{      //*p结点值为x时将其释放
        q=p;
        p=p->next;
        free(q);
        }
   }
 r->next=NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值