HOT29-删除链表的倒数第 N 个结点

news2024/11/25 4:31:58

    leetcode原题链接:删除链表的倒数第 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] 

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

解题方法:双指针法。如下三点需要注意:

1. 快指针跟慢指针的距离应该始终保持距离为n+1,也就是快指针在慢指针第n+1个节点后(从慢指针下一个节点开始数),这样当快指针到达最后nullptr的时候,慢指针在倒数第n+1个节点的位置(因为要删除第n个节点,我们需要知道第n个节点前一个节点是什么)。

2. 快慢指针的开始位置。快指针指向head节点,慢指针的开始位置在快指针的前面,这样初始位置快慢指针距离为1,快指针只需要向前先走n步即可保持跟慢节点n+1的距离。如果快慢指针初始位置相同,则快节点需要先走n+1步。

3. 使用哑节点可以减少删除的节点为head节点的情况。例如链表的长度为n的时候,删除倒数第N个节点,正常需要删除head节点的情况,但是如果引入了dummy_node,就不需要考虑这类问题。

C++代码

#include <iostream>
#include <memory> // std::shared_ptr
/**
 * 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) {}
 * };
   1—>2->3->4->5->6
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (!head) {
            return nullptr;
        }
        //引入哨兵节点: 可以不用单独考虑是否删除的是原链表的头节点
        std::shared_ptr<ListNode> dummy_node(new ListNode(0));
        dummy_node->next = head;
        ListNode *pre = dummy_node.get();//pre指向虚拟节点位置
        ListNode *p = head;//注意开始位置p在pre的后面一个节点,这样就不用p走n+1步,解决n正好等于链表长度的问题
        // 前驱节点先走n步骤
        for (int i = 0; i < n; i++) {
            if (!p) {
                return nullptr;
            }
            p = p->next;
        }
        // 两指针同时遍历,当前驱指针p走到nullptr时,pre指向倒数第n个节点的前一个节点
        while (pre && p) {
            pre = pre->next;
            p = p->next;
        }
        // 删除倒数第n个结点
        pre->next = pre->next->next;
        return dummy_node->next;
    }
};

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

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

相关文章

伦敦金k线图基础知识有多重要?

正所谓万丈高楼平地起&#xff0c;不积跬步无以至千里&#xff0c;在投资市场上也才如此&#xff0c;从来没有投资者能够在伦敦金市场上一蹴而就地取得成功&#xff0c;很多成功的交易者都是一步一个脚印&#xff0c;从最基础知识开始学起&#xff0c;逐渐成为专业的投资者。 看…

新星计划2023【Java基础及数据库Mysql】学习方向报名入口!

新星计划2023【Java基础及数据库Mysql】学习方向报名入口&#xff01; 一、关于本学习方向导师二、关于本学习方向官方微信群三、关于活动时间&奖品&要求四、学习计划五、TOP5评选规则六、活动要求七、注意事项 本赛道是针对那些希望从事Java开发并且想要学习如何与数据…

NVIDIA-Linux-x86_64-535.54.03.run cuda_12.2.0_535.54.03_linux.run下载地址

Official Drivers | NVIDIA Linux x64 (AMD64/EM64T) Display Driver | 535.54.03 | Linux 64-bit | NVIDIA 下载连接 Download NVIDIA, GeForce, Quadro, and Tesla DriversDownload drivers for NVIDIA graphics cards, video cards, GPU accelerators, and for other GeFor…

CAD转换PDF怎么转换?教你几种简单转换方法

CAD&#xff08;计算机辅助设计&#xff09;是一种广泛应用于工程设计和制造领域的软件。虽然CAD可以生成高质量的设计图纸&#xff0c;但是在与其他人共享这些图纸时可能会出现问题。因此&#xff0c;将CAD文件转换成PDF可以在各种设备上打开和查看。此外PDF还可以在不改变文件…

Postman设置断言

目录 前言&#xff1a; 一、断言的定义 二、Postman断言的语法 三、Postman中chai.js断言常用语法 前言&#xff1a; 在进行API测试时&#xff0c;断言是一项重要的功能。它能帮助我们验证接口的响应是否符合预期结果&#xff0c;从而确保API的正确性和可靠性。在Postman中…

Hudi 文件布局(File Layouts)

文章目录 Hudi File Layouts1 核心概念1.1 Base File1.2 Base File1.3 File Slice1.4 File Group 2. File Layouts写过程2.1 COW表2.2 MOR表 Hudi File Layouts 1 核心概念 File Layouts&#xff08;文件布局&#xff09;是指Hudi的数据文件在存储介质上的分布&#xff0c;Hu…

剑指 Offer ! ! 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 思路&…

Spring Boot 中的 @MessageMapping 注解:原理、用法与示例

Spring Boot 中的 MessageMapping 注解&#xff1a;原理、用法与示例 前言 随着 Web 技术的发展&#xff0c;越来越多的应用程序开始使用 WebSocket 协议来实现实时通信。Spring Boot 提供了对 WebSocket 的支持&#xff0c;其中 MessageMapping 注解是一个常用的注解&#x…

【Keepalived】keepalived部署

1.keepalived二进制安装【Ubuntu20.04】 (1).官网下载二进制源码包 官网&#xff1a; https://keepalived.org/download.html 下载二进制包&#xff1a; wget https://keepalived.org/software/keepalived-2.2.7.tar.gz亦可通过window本地下载并上传 (2).解压文件 [rootu…

[ISO26262]汽车功能安全第二部分:功能安全管理

Road vehicles—Functionalsafety— Part 2: Management offunctionalsafety (ISO 26262-2:2011, MOD) GB/T34590《 道路车辆 功能安全》分为以下部分: TOPS:当前所浏览位置: 随着技术日益复杂、 软件和机电一体化应用不断增加, 来自系统性失效和随机硬件失效的风险逐渐…

蓝桥杯专题-试题版含答案-【两点距离】【字符串替换】【盗梦空间】【素数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

无向图讲解

讲完了有向图,咱再来讲一下无向图。 直观来说若一个图中每条边都是无方向的,则称为无向图,无向图中的边均是顶点的无序对,无序对通常用圆括号表示。 定义 无向图G=<V,E>,其中: 1.V是非空集合,称为顶点集。 2.E是V中元素构成的无序二元组的集合,称为边集。 解释 直…

如何选择适合的项目管理软件?你需要考虑这些问题

在市场上有很多项目管理软件可供选择&#xff0c;但是如何确定哪种工具最易使用&#xff0c;哪些功能是项目管理必备的呢&#xff1f;在选择项目管理软件之前&#xff0c;你需要考虑以下问题&#xff1a; 项目性质 不同的项目需要不同的管理方法&#xff0c;敏捷管理适用于某…

chatgpt赋能python:Python量化数据来源-介绍

Python量化数据来源 - 介绍 Python在金融量化分析领域中得到了广泛的应用&#xff0c;这部分应用通常被称为Python量化金融。Python量化数据来源是Python量化金融分析的基础&#xff0c;只有良好的数据来源才能保证分析的准确性和有效性。 Python具有以其代码简洁易懂、强大的…

2023年富媒体行业研究报告

第一章 行业概况 富媒体行业是一个快速发展的领域&#xff0c;它涵盖了从视频、音频、动画、互动内容到虚拟现实和增强现实等多种媒体形式。这些媒体形式的共同特点是&#xff0c;它们都能提供比传统文本和静态图像更丰富、更引人入胜的用户体验。 在中国&#xff0c;富媒体行…

深入JavaScript的运行原理

1 深入V8引擎原理 2 JS执行上下文 3 全局代码执行过程 4 函数代码执行过程 5 作用域和作用域链 源代码->抽象语法树->字节码。 其中的字节码在函数执行的时候&#xff0c;由于参数的类型是一样的&#xff0c;所以有优化的机器码&#xff0c;但是如果参数类型发生变化…

昌平GPU集群使用指南 - 非官方版

昌平GPU集群使用指南 - 非官方版 可以在网址导航里看平台的使用指南&#xff0c;本文只是有益补充&#xff01; &#xff08;注&#xff1a;镜像只需要关闭&#xff0c;不需要删除&#xff09; 大致操作流程&#xff1a; 进入protainer&#xff0c;进入containers&#xff0c…

Docker删除镜像,以及导入/导出镜像

总结一下&#xff1a;删除镜像&#xff0c;以及导入/导出镜像的步骤和命令。 一、删除 1.docker rmi remove images。该命令用于删除本地镜像。 镜像通过 指定。如果省略要删除镜像的 tag&#xff0c;默认删除的是 lastest 版本。 比如&#xff1a;docker rmi zookeeper 2.删…

互联网干洗店软件及营销功能介绍

互联网干洗店洗衣洗鞋软件收件、充值、上挂等门店基本功能统统都有&#xff0c;更是支持多店互联互通&#xff0c;连接小程序、公众号&#xff0c;招揽线上生意。 为单店或多门店连锁的经营模式提供一整套的软件系统&#xff0c;包含微信公众号和小程序。 工厂版 为门店中央奢护…

接口测试面试题及答案

Http与Https的区别&#xff1a; Http与Https的区别&#xff1a; HTTP 的URL 以http:// 开头&#xff0c;而HTTPS 的URL 以https:// 开头HTTP 是不安全的&#xff0c;而 HTTPS 是安全的HTTP 标准端口是80 &#xff0c;而 HTTPS 的标准端口是443在OSI 网络模型中&#xff0c;HTTP…