LeetCode.19删除链表的倒数第N个节点(双指针,基本法)

news2024/11/28 0:40:23

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

  • 1.问题描述
  • 2.解题思路
  • 3.代码

1.问题描述

给你一个链表,删除链表的倒数第 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

2.解题思路

  1. 计算链表长度

    一种容易想到的方法是,我们首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L−n+1节点时,它就是我们需要删除的节点。

  2. 双指针

    • 虚拟头结点

    • 定义fast指针和slow指针,初始值为虚拟头结点

    • 快指针(fast)首先向前移动 n 步,这样它和慢指针(slow)之间的距离就是 n 个节点。这是为了找到倒数第 n 个节点。当fast走到最后时,slowfast之间相差n。刚好为倒数第n个节点

    • 然后,快指针再提前移动一步,这是因为我们需要删除倒数第 n 个节点,而慢指针必须指向要删除节点的前一个节点,以便进行删除操作。所以,fast多走一步。为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作)

    • fastslow同时移动,直到fast指向末尾

    • 删除slow指向的下一个节点,如图:

3.代码

C++:计算链表长度

class Solution {
public:
    int getLength(ListNode* head) {
        int length = 0;
        while (head) {
            length++;
            head = head->next;
        }
        return length;
    }

    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        int length = getLength(head);
        ListNode* cur = dummy;
        for (int i = 1; i < length - n + 1; i++) {
            cur = cur->next;
        }
        cur->next = cur->next->next;
        ListNode* ans = dummy->next;
        delete dummy;
        return ans;
    }
};

C++:双指针

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* slow = dummyHead;
        ListNode* fast = dummyHead;
        while(n-- && fast != NULL) {
            fast = fast->next;
        }
        fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点
        while (fast != NULL) {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next; 
        return dummyHead->next;
    }
};

python:计算链表长度

class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        def getLength(head:ListNode)-> int:
            length = 0
            while(head):
                length += 1
                head = head.next
            return length
        
        dummy = ListNode(0)
        dummy.next = head
        cur = dummy
        for i in range(1, length - n + 1):
            cur = cur.next
        cur.next = cur.next.next
        return dummy.next

python:双指针

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        # 创建一个虚拟节点,并将其下一个指针设置为链表的头部
        dummy_head = ListNode(0, head)
        
        # 创建两个指针,慢指针和快指针,并将它们初始化为虚拟节点
        slow = fast = dummy_head
        
        # 快指针比慢指针快 n+1 步
        for i in range(n+1):
            fast = fast.next
        
        # 移动两个指针,直到快速指针到达链表的末尾
        while fast:
            slow = slow.next
            fast = fast.next
        
        # 通过更新第 (n-1) 个节点的 next 指针删除第 n 个节点
        slow.next = slow.next.next
        
        return dummy_head.next

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

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

相关文章

5V摄像机镜头驱动IC GC6208,可用于摄像机,机器人等产品中可替代AN41908

GC6208是一个镜头电机驱动IC摄像机和安全摄像机。该设备集成了一个直流电机驱动器的Iris的PID控制系统&#xff0c;也有两个通道的STM电机驱动器的变焦和对焦控制。 芯片的特点: 内置用于Iris控制器的直流电机驱动器 内置2个STM驱动程序&#xff0c;用于缩放和…

添加通信作者标记、共同作者标记

1 添加通信作者的小信封 添加包&#xff0c;2个小信息长得不太一样选一个用 % \usepackage[misc]{ifsym} \usepackage{marvosym} % 通信小信封 然后在名字后面添加\Letter Ming Li\Letter\textsuperscript{\rm 1}\

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(2)

本篇是在海思嵌入式芯片中移植yolov7和yolov8的第二篇。做一个调试的小总结。 目前手上有SS928还有Hi3516dv500两个板子&#xff0c;3519DV500板子还没开始调。Hi3519dv500和3516是同一套SDK&#xff0c;基本上是一样的&#xff0c;算力稍高一点&#xff0c;ARM主频高一点。 我…

Python自动化测试工具selenium使用指南

概述 selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用来做自动化测试或者浏览器爬虫等。官网地址为&#xff1a;selenium。相对于另外一款web自动化测试工具QTP来说有如下优点&#xff1a; 免费开源轻量级&#xff0c;不同语言只需要一个体积很小的依赖包支持…

【性能测试】服务器常用的性能指标总结,一文概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 压测过程中&#…

基于docker的onlyoffice使用--运行JavaSpringExample

背景 我之前看到有开源项目很好地集成了onlyoffice&#xff0c;效果要比kkfilepreview好&#xff08;应当说应用场景不太一样&#xff09;。本文是在window10环境&#xff0c;安装完Docker Desktop的基础上运行onlyoffice&#xff0c;并利用官网JavaSpringExample进行了集成。 …

【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现

目录 说明&#xff1a; 1. 话题模型 图示 说明 2. 实现过程&#xff08;C&#xff09; 创建订阅者代码&#xff08;C&#xff09; 配置发布者代码编译规则 编译并运行 编译 运行 3. 实现过程&#xff08;Python&#xff09; 创建订阅者代码&#xff08;Python&…

【SpringBoot篇】登录校验 — JWT令牌

文章目录 &#x1f339;简述JWT令牌⭐JWT特点 &#x1f33a;JWT使用流程&#x1f6f8;JWT令牌代码实现&#x1f354;JWT应用 &#x1f339;简述JWT令牌 JWT全称为JSON Web Token&#xff0c;是一种用于身份验证的开放标准。它是一个基于JSON格式的安全令牌&#xff0c;主要用于…

SUDS代码复现

复现SUDS代码&#xff0c;主要进行环境配置&#xff0c;数据预处理&#xff0c;训练&#xff0c;查看PSNR渲染指标 1、环境配置 根据SUDS提供的environment.yml文件创建环境&#xff0c;由于安装总是出现环境问题&#xff0c;或者某些包无法下载的问题&#xff0c;如图&#…

单个A100生成3D图像只需30秒,这是Adobe让文本、图像都动起来的新方法

2D 扩散模型极大地简化了图像内容的创作流程&#xff0c;2D 设计行业也因此发生了变革。近来&#xff0c;扩散模型已扩展到 3D 创作领域&#xff0c;减少了应用程序&#xff08;如 VR、AR、机器人技术和游戏等&#xff09;中的人工成本。有许多研究已经对使用预训练的 2D 扩散模…

线性回归及案例实操

线性回归 回归处理的问题为预测&#xff1a; 预测房价销售额的预测设定贷款额度总结&#xff1a;上述案例中&#xff0c;可以根据事物的相关特征预测出对应的结果值 什么是回归 那么&#xff0c;这个回归究竟是什么意思呢&#xff1f;其实回归算法是相对分类算法而言的&…

uniapp上架app store详细攻略

​ 目录 uniapp上架app store详细攻略 前言 一、登录苹果开发者网站 二、创建好APP 前言 uniapp开发多端应用&#xff0c;打包ios应用后&#xff0c;会生成一个ipa后缀的文件。这个文件无法直接安装在iphone上&#xff0c;需要将这个ipa文件上架app store后&#xff0c;才…

linux下实现Qt程序开机自启动

要想实现开机自启动&#xff0c;首先&#xff0c;QT是没有这种实现的&#xff0c;最好是靠电脑开机的启动目录启动软件&#xff0c;下面这个目录 /etc/xdg/autostart 这是操作系统中用于配置启动项的目录&#xff0c;该目录下存放着开机自启动的启动器(.desktop)文件&#xf…

VMD-Attention-LSTM 价格预测实战

VMD-Attention-LSTM时间序列价格预测实战 完整数据代码可直接运行_哔哩哔哩_bilibili 数据展示:数据有几万条 足够的 主要模型代码: import tensorflow as tfdef attention_3d_block(inputs,TIME_STEPS,SINGLE_ATTENTION_VECTOR):# inputs.shape = (batch_size, time_steps,…

水离子水壁炉的科技创新与时尚家居潮流

近年来&#xff0c;水离子水壁炉作为家居装饰的新宠儿&#xff0c;正在以其独特的科技创新和时尚设计引领家居潮流。这一新型壁炉不仅注重外观美感&#xff0c;更借助先进科技实现了温馨的火焰效果&#xff0c;成为现代家居中的独特亮点。 水离子水壁炉的科技创新主要体现在其采…

人工智能在内容相关性Content Relevance方面的应用

许多公司在向客户和潜在客户提供内容服务时犯了一个错误&#xff0c;即定制性不足&#xff0c;内容过于通用&#xff0c;可能与每位目标客户都不相关。谈及内容相关性时&#xff0c;人们希望获得有用的信息和问题解决方法&#xff0c;或具有娱乐性和参与性的内容。 为客户提供…

Ubuntu20.04部署TVM流程及编译优化模型示例

前言&#xff1a;记录自己安装TVM的流程&#xff0c;以及一个简单的利用TVM编译模型并执行的示例。 1&#xff0c;官网下载TVM源码 git clone --recursive https://github.com/apache/tvmgit submodule init git submodule update顺便完成准备工作&#xff0c;比如升级cmake版本…

数据库的重要你了解多少?如何保障数据库的安全?

随着信息技术的快速发展&#xff0c;数据库已经成为企业、组织以及个人日常生活中不可或缺的一部分。然而&#xff0c;随着数据库的广泛应用&#xff0c;其安全性问题也日益凸显。数据库的安全性主要包括数据的完整性、保密性和可用性。本文将探讨数据库安全性的重要性、以及如…

户外低功耗太阳能板供电无线RTU数据采集支持定时采集各类485接口传感器数据推送数据到第三方平台远程监测系统搭建方案

户外低功耗太阳能板供电无线RTU数据采集&#xff0c;下行支持定时采集各种485接口传感器&#xff0c;对外输出5V/12V电压&#xff0c;上行支持各物联网云平台接入。

销售手里的找客户神器:天眼销

那些曾经战斗在B端&#xff08;企业&#xff09;销售战线的朋友们&#xff0c;都应该深知其中的苦涩。尤其是那如同大海捞针般的客户搜寻&#xff0c;批量客户的挖掘&#xff0c;更不用说批量精准客户的寻找了。在互联网的海洋里探索线索&#xff0c;既耗时又耗力&#xff0c;还…