学算法,刷力扣,加油卷,进大厂!

题目描述

力扣题目链接

给你一个链表的头节点 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

涉及算法

这道题目属于简单题型,涉及到数据结构中的链表。对于链表我们要知道以下内容:

  • 链表是通过指针串联在一起的线性数据结构。在链表的每个节点中,由两部分组成,即数据域(存放数据)和指针域(指向下一个节点的指针);
  • 链表的头节点没有前驱节点;
  • 链表中最后一个节点的指针域指向NULL(空指针)
  • 链表删除元素的方法,不用向数组那样,需要从后向前移动的覆盖的操作。只需要将被删除节点的前一个节点的指针指向被删除节点的后一个节点。(如下图)

那么根据题目,我们可以提炼的关键点:

  • 链表的头节点 head已知
  • 删除等于val的值,并返回新的头结点

这道题目是一个比较简单的删除操作。本文有两个思路来做这道题目。

题目解答

Java题解一

这道题目是简单的删除等于val值节点的操作,那么最主要的就是遍历链表,找出来值等于val的节点,然后使用链表的删除操作就行了。那最容易想的方法就是从表头到表尾一个一个的比较了,然后删除对应的节点就可以了。但是我们需要注意的是,头结点是没有前驱节点的,因此对于头结点满足条件的情况需要进行单独考虑。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeElements(ListNode head, int val) {//链表的头结点就满足条件,删除头结点while(head != null && head.val == val){head = head.next;}//删除非头结点(头结点不满足条件)ListNode cur = head;while(cur != null && cur.next !=null){if(cur.next.val == val){ //当前值满足条件,进行删除操作ListNode temp;temp = cur.next;cur.next = temp.next; }else{cur = cur.next; //当前值不满足条件,继续向后遍历}}return head; //返回头结点}
}

Java题解二

上面是对于头节点和非头节点的删除操作进行了分别的考虑,那能不能是它们的删除操作统一呢?
答案是可以的,那根据前面的想法,就是想办法让头结点有一个前驱节点,这样的话,直接按照正常的删除方式删除满足条件的值了。这就是虚拟节点的方式,我们定一个节点,让其作为头节点的前驱节点。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeElements(ListNode head, int val) {ListNode dummyHead = new ListNode(0); //定义虚拟节点dummyHead.next = head; //使虚拟节点作为头节点的前驱节点ListNode cur = dummyHead; //定义遍历的节点while(cur.next != null){ if(cur.next.val == val){ //满足条件的时候,直接进行删除操作ListNode temp = cur.next;cur.next = temp.next;}else{cur = cur.next; //不满足条件,继续向后遍历}}head = dummyHead.next; //返回的是原来的链表,头节点换回来return head;}
}

卷进大厂系列之LeetCode刷题笔记:移除链表元素(简单)相关推荐

  1. 卷进大厂系列之LeetCode刷题笔记:反转链表(简单)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3 ...

  2. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  3. 卷进大厂系列之LeetCode刷题笔记:设计链表(中等)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下 ...

  4. 卷进大厂系列之LeetCode刷题笔记:移除元素(简单)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间, ...

  5. 卷进大厂系列之LeetCode刷题笔记:长度最小的子数组(中等)

    学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl ...

  6. 如何判断链表中是否存在环?Floyd判圈算法 leetcode刷题笔记 142. 环形链表 II

    这道题使用了floyd判圈算法,所以先讲解floyd算法的原理和实现,最后在附加上第142题的代码. floyd算法: 一.用途: 可以在有限状态机.迭代函数或者链表上判断是否存在环,求出该环的起点与 ...

  7. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  8. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  9. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

最新文章

  1. 赞!经典教材《统计学习导论》终于有Python版了
  2. 斯坦福公开课3:欠拟合与过拟合
  3. .Net上下文Context  学习记录
  4. 不讲武德的微信,又来一波新功能!
  5. spring 链接池
  6. 配置CITRIX XML 服务与IIS 7.x共享端口
  7. Reveal使用步骤和 破解Revealapp的试用时间限制
  8. PaddleOCR——C++服务端部署Visual Studio 2019 环境下CMake 编译错误【无法打开输入文件paddle_fluid.lib】解决方案
  9. Oracle数据库的安装和配置
  10. BZOJ 2458 最小三角形(分治)
  11. 100个直接可以拿来用的JavaScript实用功能代码片段
  12. 创建新DB和新用户DBeaver连接
  13. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...
  14. linux-history历史命令-光标的移动操作-命令行上的字符删除操作
  15. 使用servlet实现果树管理系统功能实现,小项目详解,点击链接,可以获得全部源代码
  16. 我的世界源代码java复制_《我的世界》你做主,微软逐步开放源代码
  17. 计算机软件 退货,如何在在电脑收银系统中实现商品退货
  18. ISO14443 PICC 与 PCD 调制解调方式
  19. win10开启ftp连接不上的正确解决方案
  20. 使用Microsoft SyncToy 文件同步/备份 自动化处理

热门文章

  1. 【 Notes 】INS Preliminary Introduction
  2. FPGA从Xilinx 的7系列学起(5)
  3. python 中if __name__ = '__main__' 的作用
  4. 一个NODE_ENV 引发的血案
  5. win 开机 Microsoft corparation 滚动栏
  6. 修改数组的值和多维数组排序
  7. SQL Server 索引结构及其使用(二)
  8. PPP协议详细图解实验
  9. IT圈,他的牙如此不同
  10. java mysql安装教_大学java教案之MySQL安装图解