剑指 Offer II 021. 删除链表的倒数第 n 个结点

news2025/1/29 14:13:32

题目链接

剑指 Offer II 021. 删除链表的倒数第 n 个结点 mid

题目描述

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

分析:快慢指针

在解决链表问题时,我们都可以在真正的头节点 head前面添加一个 虚拟头节点 dummy,便于我们的操作。

在这里插入图片描述
-1是虚拟头节点,1才是真正的头节点,5是我们要删除的倒数第二个结点。

我们定义两个快慢指针 fastslow,初始时两个指针都指向 真正的头节点head,快指针 fast先移动 n步。

在这里插入图片描述
此时再定义一个指针 pre指向 slow的前驱节点,接着 slowfast一起移动,直到 fast指向null

在这里插入图片描述
此时 slow指向的就是倒数第 n个结点,pre指向的就是倒数第 n+1个结点。

所以我们直接删除第 n个结点。

pre->next = pre->nex->next
在这里插入图片描述

最后返回头节点 dummy->next即可。

时间复杂度: O ( n ) O(n) O(n)

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(-1);
        dummy->next = head;

        ListNode* fast = head , *slow = head;
        ListNode* pre = dummy;

        //快指针先走 n 步
        while(n){
            fast = fast->next;
            n--;
        }

        //快慢指针一起走,当 fast == nullptr时 , slow 指向的就是倒数第n个结点,pre指向的是倒数第n+1个结点
        while(fast){
            pre = slow;
            fast = fast->next;
            slow = slow->next;
        }

        //删除倒数第 n 个结点
        pre->next = pre->next->next;

        //返回头结点
        return dummy->next;

    }
};

Java代码:

/**
 * 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 removeNthFromEnd(ListNode head, int n) {
        //虚拟头节点
        ListNode dummy = new ListNode(-1);
        dummy.next = head;

        ListNode fast = head;
        ListNode slow = head;
        ListNode pre = dummy;

        //快指针先走 n 步
        while(n>0){
            fast = fast.next;
            n--;
        }

        //慢指针 和 快指针同时走 当fast == null时,slow指向 倒数第 n 个结点 , pre 指向倒数第 n+1个结点
        while(fast != null){
            pre = slow;
            fast = fast.next;
            slow = slow.next;
        }

        //删除倒数第 n 个结点
        pre.next = pre.next.next;

        return dummy.next;
    }
}

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

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

相关文章

MySQL的多表操作

多表关系 介绍 实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如&#xff1a;一个商城项目就需要分类表(category)、商品表(products)、 订单表(orders)等多张表。且这些表的数据之间存在一定的关系&#xff0c;接下来我们将在单表的基础上&#xff0c;一起学习…

DolphinDB 机器学习在物联网行业的应用:实时数据异常率预警

数据异常率预警在工业安全生产中是一项重要工作&#xff0c;对于监控生产过程的稳定性&#xff0c;保障生产数据的有效性&#xff0c;维护生产设备的可靠性具有重要意义。随着大数据技术在生产领域的深入应用&#xff0c;基于机器学习的智能预警已经成为各大生产企业进行生产数…

logback无法删除太久远的日志文件?logback删除日志文件源码分析

logback无法删除太久远的日志文件&#xff1f;logback删除日志文件源码分析 最近发现logback配置滚动日志&#xff0c;但是本地日志文件甚至还有2年前的日志文件&#xff0c;服务器是却是正常的&#xff01; 网上搜索了一波没有发现&#xff0c;只找到说不能删除太久远的旧日志…

Leetcode. 21 合并两个有序列表

尾插 核心思路&#xff1a;依次比较 &#xff0c;取经过比较后较小值进行尾插 cur1 指向list1 ,cur 2指向list2 ,当cur1走完list1 或者cur2 走完list2 后停止 如果cur1走完list1 ,可以将cur2 整个拿下来尾插 如果cur2走完list2 ,可以将cur1 整个拿下来尾插 特殊情况 &#xff1…

c# 32位程序突破2G内存限制

起因 在开发过程中&#xff0c;由于某些COM组件只能在32位程序下运行&#xff0c;程序不得不在X86平台下生成。而X86的32位程序默认内存大小被限制在2G。由于程序中可能存在大数量处理&#xff0c;期间对象若没有及时释放或则回收&#xff0c;内存占用达到了1.2G左右&#xff…

瀑布开发与敏捷开发的区别,以及从瀑布转型敏捷项目管理的5大注意事项

事实证明&#xff0c;瀑布开发管理模式并不适合所有的软件项目&#xff0c;但敏捷项目管理却对大多数项目有效。那么当团队选择转型敏捷的时候有哪些因素必须注意&#xff1f;敏捷开发最早使用者大多是小型、独立的团队&#xff0c;他们通常致力于小型、独立的项目。正是他们的…

Keepalive+LVS群集部署

KeepaliveLVS群集部署一、Keepalive概述1、什么是Keepalive2、Keepalive工作原理3、Keepalive主要模块及作用4、Keepalived 服务重要功能&#xff08;1&#xff09;管理 LVS 负载均衡软件&#xff08;2&#xff09;支持故障自动切换&#xff08;3&#xff09;实现 LVS 负载调度…

SpringBoot下的Spring框架学习(tedu)——day03——Spring DI、SpringAOP JDK动态代理

SpringBoot下的Spring框架学习&#xff08;tedu&#xff09;——day03——Spring DI、SpringAOP JDK动态代理 目录SpringBoot下的Spring框架学习&#xff08;tedu&#xff09;——day03——Spring DI、SpringAOP JDK动态代理1. Spring的依赖注入1.1 依赖注入案例1.1.1 定义接口…

Python的运算符

Python支持多种运算符&#xff0c;下表大致按照优先级从高到低的顺序列出了所有的运算符&#xff0c;运算符的优先级指的是多个运算符同时出现时&#xff0c;先做什么运算然后再做什么运算。除了我们之前已经用过的赋值运算符和算术运算符&#xff0c;我们稍后会陆续讲到其他运…

解决launch:program .exe does not exist

二. 程序的运行和调试 1.launch.json 复制下列代码至launch.json&#xff0c;并根据指导做出相对/绝对路径修改 用 IntelliSense 了解相关属性。 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.micros…

虹科教您 | 在Linux环境下安装PCAN View及通讯测试指南

应用简介 PCAN-View软件是一款简化的CAN监视软件&#xff0c;可用于显示、发送、和记录CAN数据通讯。报文可手动和定期发送&#xff0c;用户可设置比特率。在处理期间显示总线系统错误和CAN硬件的存储器过满。示踪功能可用于记录和保存CAN数据通讯。本文档的作用在于&#xff…

Python进阶-----面向对象8.0(反射---对象属性方法操作)

目录 前言&#xff1a; 反射 1.getattr() 函数 2.setattr() 函数 3.hasattr() 函数 4.delattr() 函数 前言&#xff1a; 众所周知&#xff0c;每一个实例化对象都是有实例化属性或者方法的&#xff0c;之前我们对实例化对象进行属性方法查询、删除或者添加都是直接去通过…

day27_css

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、CSS 零、 复习昨日 见代码 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通…

MpAndroidChart3最强实践攻略

本篇主要总结下Android非常火爆的一个三方库MpAndroidChart的使用。可能在大多数情况下&#xff0c;我们很少会在Android端去开发图表。但如果说去做一些金融财经类、工厂类、大数据类等的app&#xff0c;那么绝对会用到MpAndroidChart。 一、前言 2018年&#xff0c;那年的我…

打包成JAR文件和WAR文件,到底有什么区别?

Spring Boot是一种基于Spring框架的快速开发应用程序的工具&#xff0c;可以轻松地构建可部署的独立应用程序。在使用Spring Boot时&#xff0c;你可能会注意到有两种不同的部署选项&#xff1a;打包成JAR文件和WAR文件。在这篇文章中&#xff0c;我们将深入探讨这两种部署选项…

Netty 简介

一、Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架&#xff0c;使用 Netty 可以快速开发网络应用&#xff0c;Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程&#xff0c;但是你仍然可以使用底层的 API。 Netty 的内部实现是很复杂的&#xff0c;但…

Mysql常见的函数介绍

Mysql查询示例简介一、创建计算字段二、使用数据处理函数1. 文本处理函数2. 日期和时间处理函数3. 数值处理函数三、聚集函数总结简介 本篇博客中介绍了mysql查询时&#xff0c;常用的一些函数&#xff0c;融会贯通这些函数的使用&#xff0c;会对工作和学习有很大的帮助&#…

【软考中级信安】第四章--网络安全体系与网络安全模型

1.网络安全体系概述1.1 网络安全体系概念网络安全体系&#xff1a;是网络安全保障系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规则组成的&#xff0c;共同实现网络安全的目标。1.2 网络安全体系特性整体性&#xff1a;网络安全单元按照一定规则&#xff0…

SequoiaDB分布式数据库2023.2月刊

本月看点速览 技术实力获认可&#xff0c;获评多项荣誉 共建人才生态&#xff0c;与深圳大学举办奖学金颁奖仪式 青杉计划2023持续进行&#xff0c;一起攀登更高的“杉” 技术实力获认可&#xff0c;获评多项荣誉 2月&#xff0c;21世纪创投研究院发布“21世纪&#xff08;全…

【20230308】串口接收数据分包问题处理(Linux)

1 问题背景 一包数据可能由于某些传输原因&#xff0c;经常出现一包数据分成几包的情况。 2 解决方法 2.1 通过设定最小读取字符和读取超时时间 可以使用termios结构体来控制终端设备的输入输出。可以通过VTIME和VMIN的值结合起来共同控制对输入的读取。此外&#xff0c;两…