力扣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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)