LeetCode 19.删除链表的倒数第 N 个结点

news2025/1/25 6:43:59

原题链接

难度: m i d d l e \color{orange}{middle} middle

题目描述

给你一个链表,删除链表的倒数第 n n n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 s z sz sz
  • 1 < = s z < = 30 1 <= sz <= 30 1<=sz<=30
  • 0 < = N o d e . v a l < = 100 0 <= Node.val <= 100 0<=Node.val<=100
  • 1 < = n < = s z 1 <= n <= sz 1<=n<=sz

进阶: 你能尝试使用一趟扫描实现吗?


算法

  1. 题目中给的是倒数第几个结点,如果找出倒数的第几个数字?
  2. 删除结点是在原链表上删除还是更新在新的链表上?

自己的想法:链表是否需要翻转然后删除第几个结点 (×) 太麻烦

结论:可分为两次遍历和一次遍历。

(两次遍历)

链表题目,头节点特判。使用虚拟头节点。

  1. 第一次遍历求出链表长度。
  2. 第二次遍历删掉指定结点。
  3. head 前新增 dummy 节点的方式避免删除首结点时出现问题。

C++ 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        auto dummy = new ListNode(-1);
        dummy->next = head;

        int list_size = 0;
        for (auto p = dummy; p; p = p->next) list_size ++;

        auto p = dummy;
        for (int i = 0; i < list_size - n - 1; i ++) p = p->next;
        p->next = p->next->next;

        return dummy->next;
    }
};

(一次遍历)

  1. 一次遍历的思路是设置两个指针,让其中一个指针先走 n 步,然后两个指针再同时走。当第二个指针走到最后时,第一个指针的位置就是需要被删除的节点。
  2. head 前添加 dummy 节点,避免出现边界问题。
  3. 设置两个指针 p 1 p_1 p1 p 2 p_2 p2,均初始化为 dummy 节点。
  4. p 2 p_2 p2 指针先移动 n 次,然后 p 1 p_1 p1 p 2 p_2 p2 指针同时向后移动,直到 p 2 p_2 p2 指向最后一个节点。
  5. 此时 p 1 p_1 p1 结点指向的下一个结点需要删除。

C++ 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummy = new ListNode(0, head);

        auto *p1 = dummy, *p2 = dummy;

        while(n --) 
            p2 = p2->next;

        while(p2->next) {
            p1 = p1->next;
            p2 = p2->next;
        }

        p1->next = p1->next->next;

        return dummy->next;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速部署个人导航页:美好的一天从井然有序开始

很多人都习惯使用浏览器自带的收藏夹来管理自己的书签&#xff0c;然而收藏夹存在着一些问题。 经过长时间的累积&#xff0c;一些高频使用的重要网站和偶尔信手收藏的链接混在了一起&#xff0c;收藏夹因为内容过多而显得杂乱无章&#xff1b;收藏夹没有什么美观可言&#xf…

【java】Spring Boot --40 个 Spring Boot 常用注解(建议收藏)

本文目录一、Spring Web MVC 注解Spring Web MVC 注解RequestMappingRequestBodyGetMappingPostMappingPutMappingDeleteMappingPatchMappingControllerAdviceResponseBodyExceptionHandlerResponseStatusPathVariableRequestParamControllerRestControllerModelAttributeCross…

sqlServer 2019 开发版(Developer)下载及安装

下载软件 官网只有2022的&#xff0c;2019使用百度网盘进行下载 安装下崽器 选择自定义安装 选择语言、以及安装位置 点击“安装” 安装 SQL Server 可能的故障 以上步骤安装后会弹出以上界面&#xff0c;如果未弹出&#xff0c;手动去安装目录下点击 SETUP.EXE 文件…

数据分析与SAS学习笔记1

数据分析的六层模型&#xff1a; 1&#xff09;数据源层&#xff1a;数据分析的数据源&#xff1b;DBA&#xff1b;初加工&#xff1b;对数据源按某些规则进行抽取&#xff0c;ETL&#xff1b; 2&#xff09;数据仓库层&#xff1a;OLAP的功能&#xff0c;联机事务处理。OLTP、…

这才叫装机必备 , 这4款电脑软件超级实用,用一次就爱上

好用又免费的软件犹如被掩盖的珍珠&#xff0c;一旦发现了&#xff0c;让你满眼欣喜。 1、HiBit Uninstaller 这是一款大小不到10M的超实用卸载软件&#xff0c;完全免费无任何广告&#xff0c;兼顾垃圾清理、流氓软件卸载等超多实用功能&#xff0c;流氓软件卸载能力比某安全卫…

T-SQL基础(SQL高级编程语言)(二)

一、常量、变量 1. 常量 又称为字面值或标量值,程序运行过程中值不变’O’Bbaar’&#xff0c;如果单引号中的字符串包含引号&#xff0c;可以使用两个单引号表示嵌入的单引号。 2.变量 ​ 变量名不能与系统变量相同://img- 变量的声明赋值与使用 case※※ ​ case语句上…

实例一:MATLAB APP design- 简单的函数表达式运算(Y=X1^3+X2^2+X3)

一、APP 界面设计展示注&#xff1a;在自变量框输入自变量&#xff0c;点击计算按钮&#xff0c;结果就会显示在因变量输出框。二、APP设计界面运行结果展示该APP界面设计包括表达式运算显示框&#xff0c;自变量输入框&#xff0c;计算按钮&#xff0c;因变量输出框。注&#…

正大数据抢先看 祝各位情人节快乐

美国1月消费者物价指数 (CPI)周二 21:30&#xff0c;估6.2%&#xff0c;前值 6.5%。 周三12:00达拉斯FED总裁、03:00纽约FED总裁发表演说、和欧洲 央行 (ECB)总裁拉加德22:00演说。 日本政府预定周二向国会提出日本银行 (央行&#xff0c;BOJ) 总裁黑田东彦的继任人选。 市场高…

【服务器数据恢复】Hyper-V虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; WinServer操作系统服务器&#xff0c;部署Hyper-V虚拟机环境&#xff1b; 虚拟机的硬盘文件和配置文件存储在一台存储设备中&#xff1b; 该存储设备配置&#xff1a;一组4盘raid5阵列存放虚拟机数据单块盘存放虚拟机数据备份。 服务器故障&am…

附录1-pytorch目标检测

源码来自作者Bubbliiiing&#xff0c;我对参考链接的代码略有修改&#xff0c;网盘地址 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;bfvs 目录 1 参考 2 环境 3 数据集准备 3.1 VOCdevkit/VOC2007 3.2 model_data/voc_classes.txt 3.3 voc_annota…

【Java|多线程与高并发】进程与线程的区别与联系

文章目录什么是进程什么是线程上下文切换多线程一定比串行执行快吗进程与线程的区别与联系什么是进程 进程的定义:进程是正在运行的程序实体&#xff0c;并且包括这个运行的程序中占据的所有系统资源&#xff0c;比如说CPU&#xff08;寄存器&#xff09;&#xff0c;IO,内存&a…

自学前端最容易犯的10个的错误,入门学前端快来看看

在前端学习过程中&#xff0c;有很多常见的误区&#xff0c;包括过度关注框架和库、缺乏实践、忽视算法和数据结构、忽视浏览器兼容性、缺乏团队合作经验、忽视可访问性、重构次数过多、没有关注性能、缺乏设计知识以及没有持续学习等。要避免这些误区&#xff0c;应该注重基础…

Lambda表达式详细操作

一、基础语法 形态一&#xff1a;匿名内部类 Runnable runnable new Runnable() {Overridepublic void run() {System.out.println(Thread.currentThread().getName());} };runnable.run();形态二&#xff1a;完整的Lambda表达式 口诀&#xff1a;复制小括号&#xff0c;写…

消息中间件----内存数据库 Redis7(第1章 Redis 概述)

第1章 Redis 概述1.1 Redis 简介Redis&#xff0c;Remote Dictionary Server&#xff0c;远程字典服务&#xff0c;由意大利人 Salvatore Sanfilippo&#xff08;又名Antirez&#xff09;开发&#xff0c;是一个使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、…

【路径规划】基于Dijkstra算法及Floyd算法的通信与网络路径规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Dubbo相关问题合集

Dubbo相关问题合集 java.io.StreamCorruptedException: invalid stream header: 77D30000 ; Decode rpc invocation failed 现象 2023-02-14 09:49:32.251 [NettyServerWorker-4-2] [] [WARN] o.a.d.r.exchange.codec.ExchangeCodec-130 [DUBBO] Skip input stream 634, du…

go gin学习记录2

环境 环境&#xff1a;mac m1&#xff0c;go version 1.17.2&#xff0c; goland&#xff0c; mysql 昨天学习了安装和基本的参数&#xff0c;路由使用&#xff0c;今天接着学习一下数据库的操作。 建立数据库 测试数据库操作&#xff0c;需要先准备一个测试用的数据库&…

【自适应软件开发过程思想】自适应软件开发 - 简介 Adaptive Software Development Introduction(中英文)

目录 ASWD 核心思想 什么是敏捷(Agile)? 敏捷宣言(Agile Manifesto) 敏捷的特征

微前端指北

微前端概述 Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently. – Micro Frontends 什么是微前端 微前端是一种类似于微服务的架构&#xff0c;它将微服务的理念应用于浏览器端&#xff0c;即将 …

GAN和CycleGAN

文章目录1. GAN 《Generative Adversarial Nets》1.1 相关概念1.2 公式理解1.3 图片理解1.4 熵、交叉熵、KL散度、JS散度1.5 其他相关&#xff08;正在补充&#xff01;&#xff09;2. Cycle GAN 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Ne…