删除链表的倒数第 N 个结点 | LeetCode-19 | 双指针 | 递归 | 栈 | 四种方法

news2024/10/17 21:22:38
🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张
这道题还可以用递归法,你想到了吗?毛毛张介绍四种方法

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

1.题目描述

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

示例 1:

img

输入: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.题解

2.1 暴力解法

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 获取链表的长度
        int length = getLength(head);

        // 判断要删除的节点位置
        int index = length - n;

        // 创建一个虚拟头节点,指向head
        ListNode dummy = new ListNode(0, head);

        // 要删除的结点的前一个结点
        ListNode pre = dummy;
        for (int i = 0; i < index; i++) {
            pre = pre.next;
        }

        // 执行删除操作
        pre.next = pre.next.next;

        // 返回新链表的头节点
        return dummy.next;
    }

    // 获取链表长度函数
    public int getLength(ListNode head) {
        int length = 0;
        while (head != null) {
            length++;
            head = head.next;
        }
        return length;
    }
}

2.2 双指针- 暴力解法优化

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 创建一个虚拟头节点,指向head
        ListNode dummy = new ListNode(0, head);
        
        // 初始化双指针,都指向虚拟头节点
        ListNode first = dummy, second = dummy;
        
        // 让first指针先走n步
        for (int i = 0; i < n; i++) {
            first = first.next;
        }
        
        // 同时移动first和second指针,直到first指针到达链表末尾
        while (first.next != null) {
            first = first.next;
            second = second.next;
        }
        
        // 此时second指针的下一个节点就是要删除的节点
        // 执行删除操作
        second.next = second.next.next;
        
        // 返回新链表的头节点
        return dummy.next;
    }
}

2.3 递归

class Solution {
    int count = 0; // 计数器,用于记录递归层数

    // 递归法 三步走
    // 1.确定形参和返回值
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 2.确定单层递归条件
        if (head == null) return null;

        // 3.确定单层递归逻辑
        head.next = removeNthFromEnd(head.next, n); // 递归到链表末尾
        count++; // 递归返回时增加计数
        return count == n ? head.next : head; // 如果当前节点是倒数第n个节点,跳过它
    }
}

2.4 借助栈

  • 我们知道递归的本质就是栈,因此我们也可以使用栈来解决这道题目
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //虚设一个头节点  
        ListNode newHead = new ListNode(0,head);
        //创建栈用于存储链表结点
        Stack<ListNode> stack = new Stack<>();
        //开始迭代,所有结点入栈
        ListNode cur = newHead;
        while(cur != null){
            stack.push(cur);
            cur = cur.next;
        }

        //从栈顶开始弹出元素,一直弹到要删除的位置
        for(int i=0;i<n;i++){
            stack.pop();
        }
        //再弹出的元素就是要删除的结点的前一个元素
        ListNode pre = stack.pop();
        //删除操作
        pre.next = pre.next.next;
        //返回结果
        return newHead.next;
    }
}

都看到这了,不妨一键三连再走吧!

🌈欢迎和毛毛张一起探讨和交流!
联系方式参见个人主页:
神马都会亿点点的毛毛张

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

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

相关文章

《Linux从小白到高手》综合应用篇:深入理解Linux进程调优

本篇深入介绍Linux进程调优. 1. Linux系统进程类型&#xff1a; Linux的进程可能有成千上万个&#xff1a; ‌新建状态‌&#xff1a;进程刚刚被创建&#xff0c;但尚未运行。 ‌就绪状态‌&#xff1a;进程已经准备好运行&#xff0c;等待CPU分配。 ‌运行状态‌&#xff1…

解读 AI 获客关键要素,开启营销新未来

​在当今数字化浪潮席卷的时代&#xff0c;企业获客的难度与日俱增&#xff0c;传统方式逐渐力不从心。而 AI 获客宛如一颗璀璨的新星&#xff0c;为企业带来全新的机遇。 AI 获客凭借人工智能强大的数据分析能力&#xff0c;能从海量数据中精准挖掘出目标客户。其优势显著&…

C语言题目练习2

前面我们知道了单链表的结构及其一些数据操作&#xff0c;今天我们来看看有关于单链表的题目~ 移除链表元素 移除链表元素&#xff1a; https://leetcode.cn/problems/remove-linked-list-elements/description/ 这个题目要求我们删除链表中是指定数据的结点&#xff0c;最终返…

虹科应用 | 15分钟部署CAN记录仪,节省95%成本的秘诀是什么?

欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 虹科CSS的CANedge数据记录仪专为汽车和工业领域的工程师设计&#xff0c;旨在通过监控现场资产来支持研发、诊断和预测性维护。为了将这些数据转化为直观的可视化信息&#xff0c;工程师们通常依赖于Grafana仪表板…

MuMu模拟器12 KitsumeMask安装教程

这里是引用"> 在MuMu模拟器上安装KitsumeMask的时候遇到安装失败的情况。 一、下载APK安装包 如果你没有apk安装包可以通过下面的百度网盘进行下载 通过网盘分享的文件:KitsumeMask 链接: https://pan.baidu.com/s/1yeq3I6BsUD7J6uI-bnk-Vw?pwd=7n3v 提取码: 7n3v 二…

【LeetCode】动态规划—123. 买卖股票的最佳时机 III(附完整Python/C++代码)

动态规划—123. 买卖股票的最佳时机 III 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系状态定义&#xff1a;状态转移公式&#xff1a;初始条件&#xff1a; 3. 解决方法动态规划方法伪代码&#xff1a; 4. 进一步优化5. 小总结 Python代码Python代码解释 C代码C代码解…

『网络游戏』代码操作数据库增删改查【22】

创建一个新的Vistual Studio案例工程 命名为SqlTest 导入MySql.dll (官网安装即可) 导入到新建工程创建Libs文件夹放里即可 浏览找到位置添加引用即可 1.增加数据 编写脚本&#xff1a;Program 运行工程 - 添加/插入完成 打开navicat查看数据库表信息 在增加数据中可以获取主…

如何安装Tensorflow GPU版本

可以安装对应版本的cudatoolkit cudnn 我这次需要安装tensorflow-gpu1.15.0 经查看 对应的cuda 10 所以&#xff1a; conda install cudatoolkit10.0.130它对应的是cudnn 7.4 但是没安装成功 然后我直接输入 conda install cudnn 它根据cuda10 找到了对应的cudnn 7.6.…

13.JVM内存模型深度剖析

一、JDK体系结构 JDK代表Java Development Kit(Java开发工具包)&#xff0c;是用于开发和编译Java应用程序的软件包。JDK是由Oracle提供的Java平台的官方实现&#xff0c;包含了开发和运行Java程序所需的工具、库和JRE(Java Runtime Environment)。 二、JAVA语言跨平台特性 Ja…

控制模型执行 | AnyLogic帮助

控制模型执行 | AnyLogic帮助 当运行AnyLogic模型时&#xff0c;您可以使用控制面板来控制模型的执行&#xff0c;控制面板显示在AnyLogic模型窗口的底部。 控制面板包含用于控制启动模型执行的按钮&#xff1a; 按钮命令描述运行[仅当模型当前未运行时可见]从当前状态运行模…

无人机之交互系统篇

一、系统构成 无人机交互系统通常由多个子系统组成&#xff0c;包括但不限于&#xff1a; 多模式人机交互装置&#xff1a;这是人机交互系统的基础层&#xff0c;通常包括计算机、局域网、传感器等设备&#xff0c;用于实现操作员与无人机之间的数据交互和指令传递。例如&…

MATLAB实现AM调制解调

1.基本概念 1.1 AM调制原理 调幅就是使载波的振幅随调制信号的变化规律而变化。基带信号m(t)与直流分量A0相加&#xff0c;然后和高频载波相乘实现AM信号的调制&#xff0c;如图1所示。 1.2 AM解调原理 AM信号经过信道传输&#xff0c;引入噪声后&#xff0c;再和载波相乘&…

jenkins 插件Publish Over SSH (sskey) 同步文件夹

一、安装插件 Publish Over SSH SSH Pipeline Steps 二、添加sshkey 将ssh免密登录的私钥新建到 二、准备目录 源&#xff1a;images 目标&#xff1a;/root/images2 流水线脚本 pipeline {agent anystages {stage(Dest) {steps {script{def remote [:]remote.name tstr…

【中短文--深度学习笔记】Batchsize的选择、批量归一化、loss是否已经收敛(更新中-ing)

一、如何选择合适的Batchsize&#xff1f; 如果你没有任何参考&#xff0c;那么选择2的n次方&#xff08;即64、128、256、512、1024等&#xff09;可以会更加直接和易于管理。而对于上限来说&#xff0c;batchsize大小最好<数据集样本数*0.1。 why? 梯度下降算法 在更新模…

盈利路上的关键一步:掌握五大交易离场技巧

近期&#xff0c;股市节后短暂的牛市成为了众人瞩目的焦点。有人收获颇丰&#xff0c;也有人因此亏了不少&#xff0c;时机没抓对&#xff0c;倒是被割了一波韭菜。市场起伏已是常态&#xff0c;但依旧会有很多人中招。围观近况&#xff0c;忽然深刻体会到&#xff0c;适时离场…

二值形态学基本运算的几何解释

Rafael Gonzalez和Richard Woods所著的《数字图像处理》&#xff0c;从集合角度定义膨胀和腐蚀&#xff0c;不易理解。本书从空域滤波角度对二值图像形态学中膨胀和腐蚀的定义和过程进行描述&#xff0c;并给出了动画演示过程。使用结构元素对图像的形态学处理与滤波模板的空域…

HIVE beeline连接报错Operation category READ is not supported in state standby

问题&#xff1a;hive连接报错Operation category READ is not supported in state standby 这个可能是因为hive配置的hdfs连接地址指定的是具体的namenode地址&#xff0c;但是hadoop集群配置的是HA,所以会发生主备切换&#xff0c;那么我们hive元数据配置就需要使用NameNode…

JavaEE-进程与线程

1.进程 1.1什么是进程 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运 ⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的&#xff0c;进程可 以说是计算机科学…

Arduino IDE 导入库(DallasTemperature.h和OneWire.h)

1打开IDE 2点击项目 3点击导入库 4在点击管理库 5搜索库 在下图的位置输入库名即可 6安装即可

基于Springboot+Vue的医疗废物管理系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 在系统…