19. 删除链表的倒数第 N 个结点(力扣LeetCode)

news2024/11/18 21:27:28

文章目录

  • 19. 删除链表的倒数第 N 个结点
    • 题目描述
    • 将删除倒数第n个节点转化为删除第n个节点
    • 双指针

19. 删除链表的倒数第 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

将删除倒数第n个节点转化为删除第n个节点

  先用一个哑节点(虚拟头节点)来简化删除头节点的情况。然后,它通过第一次遍历计算出链表的长度,接着计算出要到达的节点,最后通过第二次遍历找到目标节点的前一个节点。通过修改指针,实现了目标节点的删除,并且在结束前释放了删除节点和哑节点占用的内存。最终返回了新链表的头节点。
  删除第n个节点时需要找到前一个节点才能删除
在这里插入图片描述

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyhead = new ListNode(0); // 创建一个哑节点,其值为0,next指向链表的头节点head
        dummyhead->next = head;
        ListNode* cur = dummyhead; // 创建一个指针cur,初始化为指向哑节点
        int size = 0;
        while(cur) { // 遍历整个链表来计算链表的长度
            cur = cur->next;
            size++;
        }
        cur = dummyhead; // 重置cur指针回到哑节点的位置,准备第二次遍历
        int a = size - n - 1; // 计算正向第size-n个节点的索引(因为哑节点的存在,所以要额外减1)

        while(a--) { // 移动cur指针到正向第size-n个节点的前一个节点上
            cur = cur->next;
        }
        ListNode* tmp = cur->next; // 创建一个临时指针tmp,指向要删除的节点
        cur->next = cur->next->next; // 将要删除节点的前一个节点的next指向要删除节点的下一个节点,从而断开连接

        delete tmp; // 删除tmp指针指向的节点,释放内存

        ListNode* newHead = dummyhead->next; // 保存新的头节点,即哑节点的下一个节点
        delete dummyhead; // 删除哑节点,释放内存
        
        return newHead; // 返回新的头节点
    }
};

双指针

  通过使用两个指针来实现的,一个快指针(fast)首先向前移动 n 步,然后快指针和慢指针(slow)一起移动直到快指针到达链表尾部。此时慢指针指向的是倒数第 n 个节点的前一个节点。然后该节点被删除,并释放其内存。最后,函数删除了在开始时创建的哑节点(虚拟头节点),并返回链表的新头节点。

  • fast先移动n步
    在这里插入图片描述
  • 然后fast和slow再同时移动,fast移动到NULL,slow随着fast一起移动就能找到需要删除的节点,因为删除节点需要找到删除节点的前一个结点,所以fast只需要移动到NULL的前一个结点,slow结点也就移动到删除节点的前一个结点
    在这里插入图片描述
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 创建一个哑节点(dummy head),其值不重要,目的是为了简化边缘情况的处理,
        // 比如删除的是链表的头节点。哑节点的下一个节点是链表的实际头节点。
        ListNode* dummyhead = new ListNode(0);
        dummyhead->next = head;

        // 创建两个指针,fast 和 slow,都开始时指向哑节点
        ListNode* fast = dummyhead;
        ListNode* slow = dummyhead;

        // 移动快指针fast,使其领先慢指针slow n 个节点。
        // 这是为了当fast指针到达链表末尾时,slow指针将指向倒数第n个节点的前一个节点。
        while(n--)
            fast = fast->next;

        // 同时移动快指针和慢指针,直到快指针到达最后一个节点。
        // 这样做是为了找到倒数第n个节点,因为当快指针到达链表尾部时,
        // 慢指针将会指向倒数第n个节点前的一个节点。
        while(fast->next != nullptr) {
            fast = fast->next;
            slow = slow->next;
        }

        // slow指针现在指向倒数第n个节点的前一个节点,
        // tmp是倒数第n个节点,准备删除这个节点。
        ListNode* tmp = slow->next;

        // 断开倒数第n个节点的连接,将其前一个节点的next指向其下一个节点,
        // 从而将其从链表中移除。
        slow->next = slow->next->next;

        // 删除tmp指针指向的节点,即释放倒数第n个节点的内存。
        delete tmp;
        // 将tmp设置为nullptr,防止悬挂指针导致的未定义行为。
        tmp = nullptr;

        // newhead是指向链表新头节点的指针,即哑节点之后的节点。
        ListNode* newhead = dummyhead->next;

        // 删除哑节点,释放其内存。
        delete dummyhead;
        // 将dummyhead设置为nullptr,防止悬挂指针导致的未定义行为。
        dummyhead = nullptr;

        // 返回链表的新头节点。
        return newhead;
    }
};

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

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

相关文章

LeetCode_17_中等_电话号码的字母组合

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 回溯 1. 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应…

中国(合一)民营企业家高峰论坛暨2024精英校友会10周年庆在上饶举行!

1月29日下午&#xff0c;“中国&#xff08;合一&#xff09;民营企业家高峰论坛暨2024精英校友会10周年庆典”在上饶市饶商金茂诚悦酒店举行。出席会议的嘉宾有民建上饶市委会专职副主委方乾文、民建上饶市委会秘书长尹林、上饶市民营&#xff08;个私)经济协会会长傅利平、上…

大数据时代效率革新:数字化管理助力企业迈向全新高度-亿发

在大数据时代的浪潮中&#xff0c;数字化管理成为企业不可或缺的发展趋势。以信息技术为支撑&#xff0c;数字化管理为企业带来了前所未有的机遇和挑战。让我们一起探讨&#xff0c;在这个数字时代&#xff0c;数字化管理如何引领企业走向更加高效、智能的未来。 1. 数据驱动决…

【JAVA】ReentrantLock 显式锁定的类

ReentrantLock 是 Java 中用于进行显式锁定的类&#xff0c;它提供了与 synchronized 关键字类似的互斥性和可重入性&#xff0c;但相比于 synchronized&#xff0c;它提供了更灵活的锁定方式。下面对 ReentrantLock 进行详解&#xff1a; 一、ReentrantLock 是什么&#xff1…

基于JAVA+SpringBoot+Vue的前后端分离的医院管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着计算机科学的迅猛…

某赛通电子文档安全管理系统 UploadFileList 任意文件读取漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

动态微信小程序码和开发者工具解析小程序码

一、动态生成微信小程序码 1、方式一 微信官方网站&#xff0c;对已发布的小程序&#xff0c;提供了一个快捷的入口&#xff0c;输入微信小程序的page页面即可。 page页面可以通过右侧开启入口获取 也可以通过开发者工具左下角的页面地址和参数地址那里获取到 二、生成的小…

异步编程,到底有什么用?

关键词&#xff1a;高性能、架构设计、异步思想、场景落地 文章导读 场景切入 先来看一个日常生活快递寄件场景&#xff0c;从寄件人&#xff08;寄件&#xff09;到收件人&#xff08;收件&#xff09;&#xff0c;全流程如下 当你准备寄送一个包裹时&#xff0c;通常你可以…

智慧水务(水厂)大数据平台,打造水务运营管理驾驶舱

智慧水务运营管理平台 全天候把握水源、水厂、管网、泵站等生产调度全过程数据。各环节数据联动&#xff0c;形成设备自动运行的预设逻辑&#xff0c;简化人工操作&#xff0c;实现无人值守。并对取水总能耗、吨水电耗、运行经济性成本加以分析&#xff0c;辅助水务系统节能降…

2024年混合云:趋势和预测

混合云环境对于 DevOps 团队变得越来越重要&#xff0c;主要是因为它们能够弥合公共云资源的快速部署与私有云基础设施的安全和控制之间的差距。这种环境的混合为 DevOps 团队提供了灵活性和可扩展性&#xff0c;这对于大型企业中的持续集成和持续部署 (CI/CD) 至关重要。 在混…

BRAIN :帕金森病中与痴呆相关的动态功能连接改变

fMRI成像手段由于其在高空间分辨率的优势获得了疾病研究的青睐&#xff0c;越来越多的疾病研究使用fMRI手段来通过找到特异的神经标记物从而提升临床治疗的诊断效力以及准确率。但是&#xff0c;功能磁共振受到其时间分辨率相对较低这一缺点的影响&#xff0c;在对疾病时间特异…

opencv c++ (7):模糊与锐化

1. 高斯模糊 Size越大模糊程度越大&#xff0c;原理不在介绍&#xff0c;直接看使用方法&#xff0c;一般都用高斯模糊&#xff0c;其他模糊方法可自寻探索 #include <iostream> #include<opencv.hpp> #include<opencv2\highgui\highgui.hpp>using namespa…

幻兽帕鲁能在Mac上运行吗?幻兽帕鲁Palworld新手攻略

幻兽帕鲁能在Mac上运行吗&#xff1f; 《幻兽帕鲁》目前还未正式登陆Mac平台&#xff0c;不过通过一些方法是可以让游戏在该平台运行的。 虽然游戏不能在最高配置下运行&#xff0c;但如果你安装了CrossOver这个软件&#xff0c;就可以玩了。这是为Mac、Linux和ChromeOS等设计…

【unity小技巧】FPS简单的射击换挡瞄准动画控制

文章目录 射击动画控制换弹动画瞄准动画完结 射击动画控制 换弹动画 调用 瞄准动画 问题&#xff1a;瞄准时&#xff0c;但是动画会卡住&#xff0c;不会播放瞄准的待机动画 修改 调用 动画如果太快可以去修改播放速度 播放速度变慢了&#xff0c;可能导致切换待机动画也…

Verdi简介

3.1.1 Verdi的历史 相信做IC验证的朋友或多或少都使用过VCS和Verdi这两个工具&#xff0c;这两个工具目前都属于synopsys公司&#xff0c;但是Verdi的来源可谓一路坎坷。 Verdi最开始是由novas公司设计的&#xff0c;在2008年&#xff0c;被台湾的EDA厂家springsoft&#xff08…

【博士每天一篇论文-算法】Continual Learning Through Synaptic Intelligence,SI算法

阅读时间&#xff1a;2023-11-23 1 介绍 年份&#xff1a;2017 作者&#xff1a;Friedemann Zenke&#xff0c;巴塞尔大学弗里德里希米歇尔研究所(FMI) Ben Poole&#xff0c;谷歌 DeepMind 研究科学家 期刊&#xff1a; International conference on machine learning. PMLR…

jdk17新特性—— record关键字(类似于Lombok功能)

目录 一、record关键字的概述1.1、概述1.2、特性 二、record关键字的代码示例2.1、record关键字代码示例2.2、record关键字代码.class文件示例2.3、record关键字代码示例 总结说明 三、record关键字实现密封接口的代码示例3.1、record关键字实现密封接口的代码示例 四、record关…

Linux 常用命令行

Linux (Ubuntu) 常用操作命令行 1. 打开终端&#xff1a;ctrl alt t; 2. 清屏&#xff1a;clear; 3. 进入目录&#xff1a;cd path;[/ 根目录&#xff1b;./ 当前目录&#xff1b;../ 上一级] 4. 返回上一级目录: cd ..; 5. 显示工作路径: pwd; 6. 列表显示文件、文件夹&…

PAT-Apat甲级题1004(python和c++实现)

PTA | 1004 Counting Leaves 1004 Counting Leaves 作者 CHEN, Yue 单位 浙江大学 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child. Input Specification: Each input file contains one te…

【超详细教程】2024最新Pytorch安装教程(同时讲解安装CPU和GPU版本)

目录 一、前言 二、pytorch简介 三、安装准备工作 3.1、下载Anaconda 四、判断是否有NVIDIA显卡 五、安装pytorch-CPU版本 六、安装pytorch-GPU版本 6.1、查看CUDA显卡驱动版本 6.2、安装CUDA 6.3、安装CuDNN&#xff08;加速器&#xff09; 6.4、安装pytorch-GPU 七…