移除链表元素(C语言实现)

目录

 题目描述

思路

解题方法

代码实现 


 题目描述

思路

此题思路与链表中间位置删除类似,但多了些细心和耐心。 主要思路是将要删除节点的前后节点先连接,之后删除中间节点,再进行迭代。

解题方法

创建两个变量,一个指向头节点,一个指向空指针,当节点的数字与val相等时判定为删除,否则迭代。迭代方法是将cur赋值给prev,将cur->next赋值给cur。判定删除时再分当头节点为val时和正常情况(没有头删时可能会触发解引用空指针),头节点为val时为头删,将头节点的下一个节点地址更新为头节点,再删除原头节点;正常情况则是越过要删除的节点,将前后节点连接,再删除中间节点。

 

代码实现 

typedef struct ListNode Node;

struct ListNode* removeElements(struct ListNode* head, int val) {
 Node* prev=NULL,*cur=head;

  while(cur)
  {

    if(cur->val==val)
    {
         if(cur==head)//当头节点的值为val时,是头删
         {
           head=cur->next;
           free(cur);
           cur=head;,
         }
        else//非头节点的删除
        {
           prev->next=cur->next;//越过cur节点,连接cur前后两个节点
           free(cur);
           cur=prev->next;//将连接后的prve->next赋值给cur
        }
    }
    else//迭代
    {
       prev=cur;
       cur=cur->next;
    }

  }

return head;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值