移除链表元素

题目

力扣题目链接(opens new window)

题意:删除链表中等于给定值 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】移除链表元素的更多相关文章

  1. 【LeetCode】203.移除链表元素

    203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...

  2. LeetCode 203:移除链表元素 Remove LinkedList Elements

    删除链表中等于给定值 val 的所有节点. Remove all elements from a linked list of integers that have value val. 示例: 输入 ...

  3. 【Leetcode链表】移除链表元素(203)

    题目 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3-&g ...

  4. [LeetCode] Remove Linked List Elements 移除链表元素

    Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...

  5. Java实现 LeetCode 203 移除链表元素

    203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2 ...

  6. [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)

    题目 203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 题解 删除结点:要注意虚拟头节点. 代码 class Solution { public ListNode removeEle ...

  7. [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 ...

  8. Leecode刷题之旅-C语言/python-203移除链表元素

    /* * @lc app=leetcode.cn id=203 lang=c * * [203] 移除链表元素 * * https://leetcode-cn.com/problems/remove- ...

  9. [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 ...

  10. 移除链表元素&反转链表&设计链表

    一.移除链表元素 203.移除链表元素 leetcode链接 1.方法概述 带傀儡节点的方法: 创建一个傀儡节点puppet来充当该链表的假头节点,当真正的头结点head不为null时,且在真正的头节 ...

随机推荐

  1. OpenPower机器上面搭建RabbitMQ 以及简单进行用户配置的方法

    OpenPower机器上面搭建RabbitMQ 以及简单进行用户配置的方法 公司有一台性能比较好的power机器. 同事要求安装rabbitmq 今天尝试进行了一下处理 公司里面有网络有相应的源 性能 ...

  2. vue面试题(一)正在重新整理

    1.输入一个 URL到浏览器整个过程发生了什么?ok 1.浏览器查找当前 URL是否存有缓存,并检查这个缓存是否过期 2.DNS 解析 URL 对应的 IP 3.根据 IP 建立 TCP 连接(三次握 ...

  3. [2] 以逆向的角度来看流程控制语句——switch

    [2] 以逆向的角度来看流程控制语句--switch 1. switch分支数小于4 汇编标识: 00401021 mov [ebp-4], ecx 00401024 cmp dword ptr [e ...

  4. 从零开始配置 vim(3)—— 键盘映射进阶

    严格意义上来说,快捷键的绑定应该是键盘映射,将某些键映射为另一些键. 在上篇我们介绍了基本的键盘映射操作,知道了如何 :map.:imap.:vmap.:nmap这些命令来映射键盘快捷键.它们很方便, ...

  5. 3.1 DLL注入:常规远程线程注入

    动态链接库注入技术是一种特殊的技术,它允许在运行的进程中注入DLL动态链接库,从而改变目标进程的行为.DLL注入的实现方式有许多,典型的实现方式为远程线程注入,该注入方式的注入原理是利用了Window ...

  6. C/C++ 反汇编:流程控制与循环结构

    反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高级语言代码都有相当大的帮助, ...

  7. Oracle配置DCD避免会话被防火墙强制断开

    今天有客户反馈应用测试连接Oracle数据库的会话半小时左右未做操作就会被中断,报错ORA-3113,询问数据库是否有这样的超时设置,能否取消掉这个限制? 登上环境查看监听日志发现连接的IP和数据库I ...

  8. Matter开发,看这一篇就够了

    1. Matter介绍 Matter(以前称为 Project Connected Home over IP 或 Project CHIP)是由CSA联盟制定的一个应用层面的标准,旨在打造一个统一的智 ...

  9. .NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记

    16 | 选项数据热更新:让服务感知配置的变化 选项框架还有两个关键类型: 1.IOptionsMonitor 2.IOptionsSnapshot 场景: 1.范围作用域类型使用 IOptinsSn ...

  10. MySQL8.0-CTE递归查询(避免死循环)

    TSQL脚本能实现递归查询,用户使用共用表表达式 CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询. 本文详细介绍CTE递归调用的特性和使用示例,递归查 ...