力扣203(java&python)-移除链表元素(简单)
题目:
给你一个链表的头节点 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
添加一个虚拟头结点,并把虚拟头结点的下一个结点指向原始的头结点,在当前结点后还有结点的情况下,遍历并删除val的结点,最后返回虚拟头结点的下一个结点即可。
具体的遍历删除方法为:
- 定义一个虚拟结点,并指向原链表的头结点;
- 定义当前结点cur并初始化为虚拟头结点;
- 当前结点后还有结点时,进行遍历,当当前结点的下一个结点是待删除的结点时,就将当前节点指向它下一结点的下一结点(删除当前结点的下一结点),否则右移当前结点到当前结点的下一结点;
- 最后返回虚拟结点的下一个结点即可。
注意:
1.cur.next.val == val,而不是cur.next = val?
val表示的是一个值,cur.next表示的是cur的下一个结点的地址,而cur.next.val 表示的是下一个结点的值,题目要求的是删除链表中给定值的结点,应该是值与值进行比较,而不应该是结点地址与值进行比较。
2.最后返回的是 dummyHead.next,而不是cur.next?
最开始将虚拟结点dummyHead赋值给cur,但是后续遍历过程中cur一直在移动,导致最后遍历完链表时,cur指向的是链表末尾的那个结点,而dummyHead没有移动。
java代码:
1 /**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11 class Solution {
12 public ListNode removeElements(ListNode head, int val) {
13 //定义一个虚拟结点,并指向原链表的头结点
14 ListNode dummyHead = new ListNode(0, head);
15 //定义当前结点cur并初始化为虚拟头结点
16 ListNode cur = dummyHead;
17 //当前结点后还有结点
18 while(cur.next != null){
19 //当前结点的下一个结点是待删除的结点
20 if(cur.next.val == val){
21 //将当前节点指向它下一结点的下一结点(删除当前结点的下一结点)
22 cur.next = cur.next.next;
23 }else{
24 //右移当前结点到当前结点的下一结点
25 cur = cur.next;
26 }
27 }
28 //返回头结点是虚拟节点的下一个
29 return dummyHead.next;
30 }
31 }

Python3:
1 # Definition for singly-linked list.
2 # class ListNode:
3 # def __init__(self, val=0, next=None):
4 # self.val = val
5 # self.next = next
6 class Solution:
7 def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
8 dummyHead = ListNode(0, head)
9 cur = dummyHead
10 while cur.next:
11 if cur.next.val == val:
12 cur.next = cur.next.next
13 else:
14 cur = cur.next
15 return dummyHead.next

小知识:
初始化链表:
①初始化一个空节点,初始赋值为0,指针指向为list;
ListNode list = new ListNode(0);
②初始化一个空节点,初始赋值为0,并且list的下一个next指针指向head,指针指向为list;(通常定义一个空节点还需要有节点的next指针指向,否则只是定义一个空节点)
ListNode list = new ListNode(0,head);
或者
ListNode list = new ListNode(0);
list.next=head;
③定义一个空链表
ListNode list=null;
力扣203(java&python)-移除链表元素(简单)的更多相关文章
- 力扣(LeetCode)移除链表元素 个人题解
删除链表中等于给定值 val 的所有节点. 这题粗看并不困难,链表的特性让移除元素特别轻松,只用遇到和val相同的就跳过,将指针指向下一个,以此类推. 但是,一个比较麻烦的问题是,当链表所有元素都和v ...
- Java实现 LeetCode 203 移除链表元素
203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2 ...
- 【LeetCode】203.移除链表元素
203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)
题目 203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 题解 删除结点:要注意虚拟头节点. 代码 class Solution { public ListNode removeEle ...
- Leecode刷题之旅-C语言/python-203移除链表元素
/* * @lc app=leetcode.cn id=203 lang=c * * [203] 移除链表元素 * * https://leetcode-cn.com/problems/remove- ...
- 移除链表元素&反转链表&设计链表
一.移除链表元素 203.移除链表元素 leetcode链接 1.方法概述 带傀儡节点的方法: 创建一个傀儡节点puppet来充当该链表的假头节点,当真正的头结点head不为null时,且在真正的头节 ...
- 代码随想录训练营day 4|链表基础理论,移除链表元素,设计链表,反转链表
链表理论基础 链表是一种由指针串联在一起的线性结构,每一个节点都由一个数据域和一个指针域组成. 链表的类型有:单链表.双链表.循环链表. 链表的存储方式:在内存中不连续分布. 链表的定义很多人因为不重 ...
- [LeetCode] Remove Linked List Elements 移除链表元素
Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...
- 力扣——Linked List Cycle(环形链表) python实现
题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...
随机推荐
- Android源码在线查看网站
一.aospxref http://aospxref.com/ 优点:更新速度快 缺点:历史版本较少 二.androidxref http://androidxref.com/ 优点:历史版本较多 缺 ...
- verilog勘误系列之-->算术运算符运算失败
描述 在verilog代码设计时使用算术运算符与乘法搭配使用出现计算错误 原因 由于数据位宽设置不当导致 错误案例 wire signed [13:0] w01; wire signed [23:0] ...
- 一个.net6开发的截图后ocr小工具
软件使用 .net6 winfrom 开发 ocr使用的是paddleOCR .net下调用paddleOCR 用 sdcb.PaddleOCR https://github.com/sdcb/Pad ...
- 探讨三维模型OBJ格式轻量化在数据存储的重要性
探讨三维模型OBJ格式轻量化在数据存储的重要性 三维模型的OBJ格式轻量化在数据存储方面具有重要性.以下是对三维模型OBJ格式轻量化在数据存储的重要性进行浅析: 1.节省存储空间:原始的三维模型文件往 ...
- Cesium渲染模块之FBO与RBO
1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...
- 李沐动手学深度学习pytorch实践笔记
1.pytorch中的矩阵乘法: 2.标量对向量求导: 3.pytorch的backward函数: 4.如何直观理解梯度下降: 梯度,是个向量,有方向和长度就是向量,向量里的各个元素是偏导.是标量对向 ...
- 在 .NET 中使用 OPC UA 协议
目录 什么是 OPC UA UaExpert 的使用 下载 UaExpert 首次启动 添加 OPC UA 服务器 连接 OPC UA 服务器 查看 PLC 数据 使用 C# 读写 OPC UA 数据 ...
- Spring Cloud 服务的注册与发现之eureka客户端注册
1.在客户端maven项目中添加eureka客户端依赖 <dependency> <groupId>org.springframework.cloud</groupId& ...
- KingbaseES V8R3集群运维案例之---主库数据库服务down后failover切换详解
案例说明: 对KingbaseES V8R3集群,主库数据库服务down后,failover切换进行分析,详解其执行切换的过程,本案例可用于对KingbaseES V8R3集群failover故障的分 ...
- archlinux xfce 修改用户主目录名称
操作有风险,修改用户主目录名称后一些链接了旧主目录的的链接可能仍未修改.导致链接用不了,需要手动指定链接 1.删除指定用户保存的会话,未删除应该会导致修改用户主目录名称后进不去会话 2.切换到其它用户 ...