如果您是第一次看我写的博客,可以给我点个赞并关注我吗,我会持续分享更多有意思的干货。

文章目录

  • 1 题目
  • 2 思路
  • 3 代码
  • 4 小结

1 题目

Leetcode203 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

提示:

  • 列表中的节点数目在范围 [0, 104]
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

2 思路

一开始做这道题,我是直接上来就做的,但是出现一个问题,原文是不带头结点的单链表,这就导致可能出现两种情况:一种是链表中每个元素都删除,删到后面什么都没有了,头指针指向NULL,且链表中如果只剩下一个结点我们是要做if判断,因为删除链表中的最后一个结点是一种特殊情况。

还有一种情况是,如果是链表本身什么都没有,这种情况也很难受。

对此,我们可以采用补头结点的方式。也就是说,我们可以指定一个虚拟头结点,然后补在原始链表的最前面,这样上面两种情况都可以避免。(为什么?)

避免的原因是,如果链表中不带头结点的情况下删除最后一个结点,是要做特殊情况处理,而带头结点的话,就不需要,因为删除一个结点通常是采用一个前置指针加上一个删除结点指针进行操作,而前置指针可以处在虚拟头结点上。

如果是链表本身什么都没有,那循环就不必开始。

做完这些之后,根据题意要求,我们要返回新的头结点。对于题意来说,它要的单链表是不带头结点的,所以当我们补上一个虚拟头结点后,我们要返回的自然是虚拟头结点的后面一个结点的指针。

好了,说了这么多,开始写代码了!

3 代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {//建立虚拟头结点ListNode *dummyHead = new ListNode;//将虚拟头结点接入链表dummyHead->val = 0;dummyHead->next = head;ListNode * pre = dummyHead;while(pre->next != NULL){if(pre->next->val == val){ListNode * temp = dummyHead;temp = pre->next;pre->next = temp->next;delete(temp);}elsepre = pre->next;}return dummyHead->next;}
};

4 小结

  • 时间复杂度:O(n),其中 n是链表的长度。需要遍历链表一次。
  • 空间复杂度:O(1)。

这道题的巧妙之处在于添加头结点来避免过多地判断特殊情况,由此在其他的题目中,我们也可以迁移地去学习。当然本题求解采用的是迭代的方式,如果喜欢用递归的同学也可以采用递归来处理这道题。

每日一题——Leetcode203 移除链表元素相关推荐

  1. 力扣刷题——单链表系列——第一题:移除链表元素,从此链表初窥门径,神挡杀神~

    题目链接:力扣 力扣刷题------>单链表系列 第一种解法:在原链表上进行操作,小红日烧脑版 /*** Definition for singly-linked list.* public c ...

  2. leetcode203 移除链表元素

    删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4 ...

  3. leetcode203.移除链表元素

    问题 删除链表中等于给定值 val 的所有节点. 思路 删除链表中某个结点的方法:node->next = node->next->next,可以删除node的下一个结点:考虑到链表 ...

  4. json移除一个元素_leetcode:203.移除链表元素,听说用虚拟头节点会方便很多?

    链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点在进行删除操作,接下来看一看哪种方式更方便. ❞ 第203题:移除链表元素 题意:删除链表中等于给定值 val 的所有节点. 思路 ...

  5. LeetCode Algorithm 203. 移除链表元素

    203. 移除链表元素 Ideas 这题其实很简单,从头开始遍历,只要遇到node->val==val的通通删除就OK了. Code C++ class Solution {public:Lis ...

  6. 每日一题 | 曾被反转链表支配的恐惧

    前段时间看到掘金平台推出了每日算法打卡的活动,感觉挺好,好巧不巧打开LeetCode的每日一题刚好是 反转链表,这道去年年初面试字节跳动挂掉的算法题,趁这个机会把之前算法的记忆捡回来. Date: 2 ...

  7. [数据结构]题海啊,全是水(一)移除链表元素、反转链表、链表的中间节点

    这个是目录 移除链表元素 分析 第一种情况 第二种情况 第三种情况 代码 反转链表 第一种解法 第二种解法 链表的中间节点 解法一 解法二 最后 菜鸡大学生的数据结构--刷题篇1 自从宇宙大爆炸以来, ...

  8. LeetCode-链表-203. 移除链表元素

    描述 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 1: 输入:head ...

  9. python移除链表元素

    | 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 输入:head = [1,2,6,3,4 ...

最新文章

  1. string判断是否是正常的ip格式
  2. android clean 框架,clean架构
  3. 曝光!十万开发者喜爱的顶级当红讲师
  4. jax-rs jax-ws_在JAX-RS中处理异步请求中的超时
  5. java同名变量在list中添加两次_快速解决List集合add元素,添加多个对象出现重复的问题...
  6. iphonexr电池容量_iPhone12mini电池容量多少毫安能用多久 iPhone12mini适合打游戏王者吗...
  7. 跟着开源项目学因果推断——mr_uplift(十五)
  8. C语言:下载并安装编译器(MinGW-W64 GCC)win10环境
  9. 利用C语言实现wol网络远程唤醒
  10. Verilog HDL三种描述方式
  11. 大同linux培训班,大同一对一高中辅导中心地址
  12. 浅谈计算机教学的现状分析,浅谈中职计算机专业教学的现状与对策
  13. Django与vue
  14. 【生态环境保护】绿水青山就是金山银山——生态环保篇
  15. 关闭rabbitmq连接健康检查
  16. 使用ISA Server 2004限制BT下载
  17. java中GRID_size的作用_Grid布局简介
  18. css-doodle_如何使用CSS Doodle用CSS绘制图案
  19. 镁光闪存颗粒对照表_内存颗粒版本判断方法和编号解析(三星、美光、海力士)...
  20. 再谈解决“因为文件包含病毒或潜在的垃圾软件”系统找不到gpedit.msc

热门文章

  1. DEV GridView嵌套
  2. mac上nginx静态页面访问403
  3. linux批量远程多服务器FTP并下载文件的脚本
  4. 管家婆SQL SERVER数据库“可能发生了架构损坏。请运行DBCC CHECKCATALOG”修复
  5. 异步网络消息处理框架
  6. 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt...
  7. 删除wallet里面登机牌_登机牌丢失问题
  8. 第一套数字电子计算机,计算机试题第一套
  9. devise tree_Devise如何确保您的Rails应用密码安全
  10. react构建_您应该了解的有关React的一切:开始构建所需的基础知识