LeetCode 203:移除链表元素 Remove LinkedList Elements
删除链表中等于给定值 val 的所有节点。
Remove all elements from a linked list of integers that have value val.
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
解题思路:
两种方法,一种是迭代法,从第一个节点开始,遇到值相同的节点就将其删除。链表的删除操作是直接将删除节点的前一个节点指向删除节点的后一个节点即可。
第二种方法是递归,用递归从后向前遇到相同节点直接指向该节点的下一个节点的地址即可
迭代法:
由于链表删除操作的特殊性,如果要删除某个节点,必须要知道该删除节点的前一个节点地址才可完成删除操作。所以如果是从第一个节点开始判断,就要考虑到第一个节点是否为空节点、第一个节点是否就是该删除的的节点,删除头节点和非头节点的操作不一样,应单独实现删除操作。
如果原链表是这种形式:1->1->1->2
val=1
删除头节点后第二个节点置为头节点,但是第二个节点作为新的头节点依然需要删除,所以对头节点的操作应该是一个迭代过程。
另外一种方法就是新建一个虚拟节点,该虚拟节点下一个节点指向原链表头节点。这就无需考虑头节点是否为空、是否为待删除节点。如原链表为:1->1->1->2
val=1
,新建一个虚拟节点 -1 作为头节点:-1->1->1->1->2
val=1
,这时只需正常迭代删除即可,唯一要注意是返回节点不能是 head ,因为原链表的头节点如果是待删除节点,此时 head 节点已被删除并作为单独隔离出来的节点,并非链表内的一个节点。
Java:
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode newHead=new ListNode(-1);//新建虚拟节点
newHead.next=head;//虚拟节点作为原链表的头节点
ListNode cur = newHead;//遍历节点的指针
while (cur.next != null) {
if (cur.next.val == val) {
cur.next = cur.next.next;//删除操作
} else {
cur = cur.next;
}
}
return newHead.next;//返回的头节点应当是虚拟节点的下一个节点
}
}
Python3:
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
newHead = ListNode(-1)
newHead.next = head
cur = newHead
while cur.next:
if cur.next.val == val:
cur.next = cur.next.next
else:
cur = cur.next
return newHead.next
递归法:
递归方法解该题很简单,基线条件是遇到空节点(最后一个节点),递归时只需将传递参数节点的下一个节点作为新的参数传给递归函数即可:
如原链表为: 1->2->6->3->4->5->6, val = 6
递归到空节点时最后一个递归函数返回null: 1->2->6->3->4->5->6->null
回到上一层递归函数内此时 head.next 得到返回节点 null
判断head为 6 删除,返回 head.next :1->2->6->3->4->5->null
回到上一层递归函数此时 head.next 得到上一层返回节点依然为null
判断head为 5 不删除,返回 head 为5:1->2->6->3->4->5->null
回到上一层递归函数此时 head.next 得到上一层返回节点 5
判断head为 4 不删除,返回 head 为4:1->2->6->3->4->5->null
回到上一层递归函数此时 head.next 得到上一层返回节点 4
..............
直到回到第一个递归函数为止返回头节点结束。
Java:
class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head == null) return null;//基线条件
head.next = removeElements(head.next, val);
if (head.val == val) {
return head.next;
} else {
return head;
}
}
}
Python3:
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
if not head: return None
head.next = self.removeElements(head.next, val)
if head.val == val:
return head.next
else:
return head
欢迎关注公众号一起学习:爱写Bug
LeetCode 203:移除链表元素 Remove LinkedList Elements的更多相关文章
- Java实现 LeetCode 203 移除链表元素
203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2 ...
- [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)
题目 203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 题解 删除结点:要注意虚拟头节点. 代码 class Solution { public ListNode removeEle ...
- [LeetCode] 203. 移除链表元素
题目链接:https://leetcode-cn.com/problems/remove-linked-list-elements/ 题目描述: 删除链表中等于给定值 val 的所有节点. 示例: 输 ...
- 【LeetCode】203.移除链表元素
203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...
- [Swift]LeetCode203. 移除链表元素 | Remove Linked List Elements
Remove all elements from a linked list of integers that have value val. Example: Input: 1->2-> ...
- 力扣(LeetCode)移除链表元素 个人题解
删除链表中等于给定值 val 的所有节点. 这题粗看并不困难,链表的特性让移除元素特别轻松,只用遇到和val相同的就跳过,将指针指向下一个,以此类推. 但是,一个比较麻烦的问题是,当链表所有元素都和v ...
- LeetCode 203——移除链表(JAVA)
删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4 ...
- Leecode刷题之旅-C语言/python-203移除链表元素
/* * @lc app=leetcode.cn id=203 lang=c * * [203] 移除链表元素 * * https://leetcode-cn.com/problems/remove- ...
- [LeetCode] Remove Linked List Elements 移除链表元素
Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...
随机推荐
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 10
18.8 设计完美分页类 数据记录列表几乎出现在Web项目的每个模块中,假设一张表中有十几万条记录,我们不可能一次全都显示出来,当然也不能仅显示几十条.为了解决这样的矛盾,通常在读取时设置以分页的形 ...
- 【Oracle命令 】使用的sql语句之分组查询(group by)
由于本人并未对oracle数据库进行深入了解,但是工作中又需要知道一些基础的sql,所以记录下操作的sql语句.方便日后查看 1.将序列号作为分组查询的条件,再将查询出来的结果进行筛选. select ...
- jsp页面科学计数法显示问题的解决办法
在JSP页面中返回的double类型的数值,如果数值过大,就会被显示成科学计数法. 这个问题通常出现在表单填写的input中,因此是必须要解决的问题. JSTL提供了标准的数值格式化标签,使用上非常简 ...
- pandas 学习 第5篇:DataFrame - 访问数据框
数据框是用于存储数据的二维结构,分为行和列,一行和一列的交叉位置是一个cell,该cell的位置是由行索引和列索引共同确定的.可以通过at/iat,或loc/iloc属性来访问数据框的元素,该属性后跟 ...
- [ida]查看某一函数在程序中被谁引用
1. 点亮函数名 2.view - open subviews - cross references 注意:不要点击绘图那个
- Android框架Volley使用:Json请求实现
首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: < ...
- ADB控制手机命令(adb命令)
手机端配置tcp方式连接 su setprop service.adb.tcp.port 5555 stop adbd start adbd 首先使用管理员权限,然后打开监听5555端口 电脑端使用a ...
- bash 中 小括号的作用
单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格. ...
- Shell命令-用户用户组管理之id、su
文件及内容处理 - id.su 1. id:查看用户的uid,gid及归属的用户组 id命令的功能说明 id 命令用于显示用户的 ID,以及所属群组的 ID.id 会显示用户以及所属群组的实际与有效I ...
- Shell命令-网络操作之基础之telnet、ssh
文件及内容处理 - telnet.ssh 1. telnet:使用TELNET协议远程登录 telnet命令的功能说明 telnet 命令用于远端登入.执行 telnet 指令开启终端机阶段作业,并登 ...