203.移除链表元素

第一种思路

循环遍历整个链表

定义两个指针:prev,cur

如果cur是要删除的节点,prev->cur->next,然后free(cur)

但是注意每次都要新定义一个节点del,用来free,不影响原来的cur节点往下循环

更新cur和prev

但是需要注意如果删除的是头节点,就要特殊处理,画图带上指针,情况分析,一目了然。

思路一代码:

cs 复制代码
struct ListNode* removeElements(struct ListNode* head, int val) {
   struct ListNode *cur =head;
   struct ListNode *prev = NULL;
   while(cur)
   {
       struct ListNode *del = cur;
       if(del->val == val)
       {
           cur = cur->next;
           free(del);
            //如果是头节点,需要更新头节点
            if(prev == NULL)
            {
                head = cur;
            }
             else
            {
                prev->next = cur;
            }
       }
       else
        {
            prev = cur;
            cur = cur->next;
        }      
   }
   return head;
}

第二种思路:

创建新链表,不等于val的节点尾插到新链表,返回新链表

这种方式需要画出详细的过程图,否认坑很多

需要注意的点:

1、链表为空

2、最后一个节点是要不要的节点,涉及到新链表的最后一个节点的下一个节点是野指针问题,这个可以到VS上进行调试

第二种思路代码:

cs 复制代码
struct ListNode* removeElements(struct ListNode* head, int val) {
   
   struct ListNode *cur = head;
   struct ListNode *newNode = NULL, *tail =NULL;
   while(cur)
   {
       //不等于值,尾插
       if(cur->val != val)
       {
           //头节点为空
           if(tail == NULL)
           {
               tail = newNode = cur;
           }
           else
           {
               tail->next = cur;
               tail = tail->next;
           }
        cur = cur->next;
       }
       else
       {
           struct ListNode *del = cur;
           cur = cur->next;
           free(del);
       }
   //如果删除的是最后一个节点
   //会出现野指针的问题
    //对空链表进行检查
    if(tail)
        tail->next = NULL;
   }  
   return newNode;
}
相关推荐
董董灿是个攻城狮16 分钟前
Opus 4.7 来了,我并不建议你升级
算法
自我意识的多元宇宙21 分钟前
二叉树遍历方式代码解读(2迭代)
数据结构
无敌昊哥战神1 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode
脱氧核糖核酸__1 小时前
LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
数据结构·c++·算法·leetcode
再卷也是菜1 小时前
算法提高篇(1)线段树(上)
数据结构·算法
py有趣1 小时前
力扣热门100题之单词拆分
算法·leetcode
杨凯凡1 小时前
【012】图与最短路径:了解即可
java·数据结构
j_xxx404_2 小时前
C++算法:哈希表(简介|两数之和|判断是否互为字符重排)
数据结构·c++·算法·leetcode·蓝桥杯·力扣·散列表
Aaron15882 小时前
RFSOC+VU13P+RK3588的核心优势与应用场景分析
嵌入式硬件·算法·matlab·fpga开发·信息与通信·信号处理·基带工程
优家数科2 小时前
精准预测:基于多维用水量的滤芯寿命预警算法
算法