【LeetCode链表#6】移除链表元素
移除链表元素
题目
题意:删除链表中等于给定值 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
输出:[]
初见思路
就操作链表咯
常规思路
如果直接使用头节点作为当前节点的话,在删除头节点时的操作会与删除其他节点时不一致
要统一所有节点的删除方式,需要引入虚拟节点dummy
这样,每当需要删除某个节点时(包括头节点)
都可以遵循:将待删除节点的前一个节点的next指针指向待删除节点的后一个节点 这样一个规则

解题模板
不使用虚拟节点
具体还有两种写法:使用pre、cur指针和只用cur指针
具体看代码:
class Solution {
public ListNode removeElements(ListNode head, int val) {
//删除头节点的情况
while(head != null && head.val == val){
head = head.next;
}
//不要忘了,如果头节点为空就直接退出
if(head == null){
return head;
}
//删除其他节点的情况
//正常情况
ListNode pre = head;
ListNode cur = head.next;
while(cur != null){
if(cur.val == val){
pre.next = cur.next;
}else{
pre = cur;
}
cur = cur.next;
}
// //只使用一个临时节点cur
// //当前节点的指针应该指向head而不是head.next
// //因为如果要删除的就是当前cur指向的值,那么直接指向head的方式就有问题,因为在单向链表中,它找不到待删除节点的上一个节点
// //而第二种方式就避免了这种情况
// ListNode cur = head;
// while(cur != null){
// while(cur.next != null && cur.next.val == val){
// cur.next = cur.next.next;
// }
// cur = cur.next;
// }
return head;//不是返回临时节点cur,要找回最开始的头节点head
}
}
使用虚拟节点
/**
* 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) {
if(head == null){//先判断头节点是否为空,防止操作空指针
return head;
}
//创建一个虚拟节点
ListNode dummy = new ListNode(1, head);
//定义前一个节点pre与当前节点cur
ListNode pre = dummy;
ListNode cur = head;
while(cur != null){//要用循环而不是if,因为删除操作应该是连续的
if(cur.val == val){
pre.next = cur.next;
}else{
pre = cur;
}
cur = cur.next;
}
//注意!要返回虚拟节点的下一个节点,即头节点。而不是直接返回头节点,因为原来的head有可能已经被删了
return dummy.next;
}
}
反正以后就记住使用虚拟节点的方式就行,用的时候也优先这种方式
c++版本
先分析一下给的解题模板
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
}
};
这里需要我们补完一个Solution类,该类中有一个公共的成员函数removeElements
其输入值是ListNode* head(头节点的指针)和一个整形val
代码如下:(没用cur+pre,只定义一个cur)
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head == nullptr){
return head;
}
//创建dummy节点,接在头节点之前
ListNode* dummy = new ListNode(0, head);
ListNode* cur = dummy;
while(cur->next != nullptr){
if(cur->next->val == val){
//处理被删除的节点
ListNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
}else{
cur = cur->next;
}
}
//这里可以删除定义的dummy,也可以不删,估计是占用内存不同
//head = dummyHead->next;
//delete dummyHead;
//return head;
return dummy->next;
}
};
【LeetCode链表#6】移除链表元素的更多相关文章
- 【LeetCode】203.移除链表元素
203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...
- LeetCode 203:移除链表元素 Remove LinkedList Elements
删除链表中等于给定值 val 的所有节点. Remove all elements from a linked list of integers that have value val. 示例: 输入 ...
- 【Leetcode链表】移除链表元素(203)
题目 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3-&g ...
- [LeetCode] Remove Linked List Elements 移除链表元素
Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...
- 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] Remove Nth Node From End of List 移除链表倒数第N个节点
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- Leecode刷题之旅-C语言/python-203移除链表元素
/* * @lc app=leetcode.cn id=203 lang=c * * [203] 移除链表元素 * * https://leetcode-cn.com/problems/remove- ...
- [LeetCode] 19. Remove Nth Node From End of List 移除链表倒数第N个节点
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- 移除链表元素&反转链表&设计链表
一.移除链表元素 203.移除链表元素 leetcode链接 1.方法概述 带傀儡节点的方法: 创建一个傀儡节点puppet来充当该链表的假头节点,当真正的头结点head不为null时,且在真正的头节 ...
随机推荐
- [转帖]Xargs用法详解
https://www.cnblogs.com/cheyunhua/p/8796433.html 1. 简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要, ...
- [转帖]解析Linux gcore: 揭示程序内存捕获的秘密(linuxgcore)
https://www.dbs724.com/133618.html Linux gcore 是一种在Linux系统中使用命令行工具捕获进程内存内容的方法.它允许程序员制定程序的一个内存快照,从而帮助 ...
- [转帖]【JVM】GC算法与垃圾收集器
引入 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理.由于有个垃圾回收机制,可以有效的防止 ...
- 基于eBPF的微服务网络安全(Cilium 1)
基于eBPF的微服务网络安全 翻译自:Network security for microservices with eBPF 一些开源的kubernetes工具已经开始使用eBPF,这些工具大多数与 ...
- TypeScript中typeof的简单介绍
简单介绍typeof 我们都知道js提供了typeof,用来获取基本数据的类型. 实际上,TS也提供了 typeof 操作符. 可以在 [类型上下文]中进行类型查询. 只能够进行变量或者属性查询. 定 ...
- TienChin 渠道管理-渠道导入
ChannelController @PostMapping("/importTemplate") void importTemplate(HttpServletResponse ...
- Docker 安装 MySQL8 数据库
创建数据卷 mkdir -p /usr/mysql/conf /usr/mysql/data chmod -R 755 /usr/mysql/ 创建配置文件 vim /usr/mysql/conf/m ...
- 用python进行精细中文分句(基于正则表达式),HarvestText:文本挖掘和预处理工具
1.用python进行精细中文分句(基于正则表达式) 中文分句,乍一看是一个挺简单的工作,一般我们只要找到一个[.!?]这类的典型断句符断开就可以了吗. 对于简单的文本这个做法是已经可行了 ...
- C++ CryptoPP使用AES加解密
Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库.它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密.非对称加密.哈希函数.消息认证码 (MAC).数字签名等.C ...
- Win32汇编:字符串浮点数运算过程
整理复习汇编语言的知识点,以前在学习<Intel汇编语言程序设计 - 第五版>时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会 ...