力扣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,则在该链表中没有环. ...
随机推荐
- 关于python的copy()与deepcopy()之间的区别
关于python的copy()与deepcopy()之间的区别 copy为浅复制,不会产生一个独立的对象单独存在,如list中套着list的情况,当改变子list中的一个或多个元素,copy的内容也会 ...
- [置顶]
linux与windows之间传输文件工具rz上传大文件失败问题解决方案
rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具. windows端需要支持ZModem的telnet/ssh客户端(比如SecureCRT),运行命令rz即是接收 ...
- 常用加密及其相关的概念、简介(对称、AES、非对称、RSA、散列、HASH、消息认证码、HMAC、签名、CA、数字证书、base64、填充)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 在之前,一直是通过生活.工作零零碎碎 ...
- 一个简单的RTMP服务器实现 --- RTMP与H264
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Linux Char-Driver (字符驱动 摘要)(一)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- HMAC算法:数据传输的保护神
HMAC算法起源: HMAC(Hash-based Message Authentication Code)算法是由Mihir Bellare.Ran Canetti和Hugo Krawczyk于19 ...
- AndroidStudio配置 | 菜鸟教程
https://www.runoob.com/android/android-studio-install.html
- 汇编语言-使用BIOS进行键盘输入和磁盘读写
int9中断例程对键盘输入的处理 键盘输入将引发9号中断,BIOS提供了int9中断例程.CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状 ...
- 20 JavaScript和HTML交互
20 JavaScript和HTML交互 在HTML中可以直接在标签上给出一些事件的触发. 例如, 页面上的一个按钮. <input type="button" value= ...
- #最大密度子图,0/1分数规划#UVA1389 Hard Life
题目 \(n\) 个点,\(m\) 条边的一个无向图,问导出子图的边数除以点数的最大值 分析 考虑二分这个答案,也就是0/1分数规划之后转换成 \(E-mid*V>0\) 这个问题虽然可以精确到 ...