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

news2024/11/28 10:37:37
🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


一、🌱19. 删除链表的倒数第 N 个结点

  • 题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:
    链表中结点的数目为 sz
    1 <= sz <= 30
    0 <= Node.val <= 100
    1 <= n <= sz
  • 示例 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]

🌴解题

我们要删除指定节点,就是找到该节点的前驱节点 pre,将其后继节点改为需要删除节点的后继节点(不考虑节点释放情况,或者添加一个指向删除节点的指针进行释放操作)。而删除的节点可能就是头结点,不存在 pre,为了方便处理我们通常会在前面添加一个哑节点 dummy,最后返回的也就是 dummy 的后继节点。

1.双指针

我们如何确定是不是倒第 N 个数节点,采用双指针就是先让一个指针先走 N 步,然后同步遍历链表走到有个指针为空的时候。
把 fast 指针位于哑节点最后遍历结束就是位于被删除节点的前驱节点上,删除之后返回返回哑节点的后继节点即可。
在这里插入图片描述

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode fastNode=head,slowNode=new ListNode();
        slowNode.next=head;
        head=slowNode;
        for(int i=0;i<n;i++){
            fastNode=fastNode.next;
        }
        while(fastNode!=null){
            fastNode=fastNode.next;
            slowNode=slowNode.next;
        }
        // delect slowNode `s next Node
        if(slowNode.next!=null) {
            slowNode.next = slowNode.next.next;
        }else{
            slowNode.next=null;
        }
        return head.next;
    }
}

在这里插入图片描述

2.栈

这个方法也很好理解,栈是先进后出,节点全部进栈之后出栈,出栈 N 个节点,此时栈顶元素就是第 N 个节点的前驱节点

class Solution19 {
    public static ListNode19 removeNthFromEnd(ListNode19 head, int n) {
        ListNode19 dummy = new ListNode19(0, head);
        Deque<ListNode19> nodeStack = new LinkedList<ListNode19>();
        ListNode19 cur = dummy;
        while (cur != null) {//全部入栈
            nodeStack.push(cur);
            cur = cur.next;
        }
        for (int i = 0; i < n; ++i) {//出栈n个节点,后n
            nodeStack.pop();
        }
        ListNode19 prev = nodeStack.peek();//get 倒数第n个前一个
        prev.next = prev.next.next;

        return dummy.next;
    }
}

在这里插入图片描述


🌵 君不见,黄河之水天上来,奔流到海不复回。 — 李白

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓


附完整代码:

package code;

import java.util.Deque;
import java.util.LinkedList;

public class c19 {
    public static void main(String[] args) {
        int[] nums={1};
        int n=1;
        //creat ListNode
        ListNode19 head=new ListNode19(nums[0]);
        ListNode19 q=head;
        for (int i = 1; i < nums.length; i++) {
            ListNode19 p=new ListNode19(nums[i]);
            q.next=p;
            q=p;
        }

        q=Solution19.removeNthFromEnd(head,n);
        while (q!=null){
            System.out.print(q.val+" ——> ");
            q=q.next;
        }
        System.out.println("end");

    }
}
class ListNode19{
    int val;
    ListNode19 next;
    public ListNode19() {
    }
    public ListNode19(int val) {
        this.val = val;
    }
    public ListNode19(int val, ListNode19 nextNode) {
        this.val = val;
        this.next = nextNode;
    }
}
/*
//双指针
class Solution19 {
    public static ListNode19 removeNthFromEnd(ListNode19 head, int n) {
        ListNode19 fastNode=head,slowNode=new ListNode19();
        slowNode.next=head;
        head=slowNode;
        for(int i=0;i<n;i++){
            fastNode=fastNode.next;
        }
        while(fastNode!=null){
            fastNode=fastNode.next;
            slowNode=slowNode.next;
        }
        // delect slowNode `s next Node
        if(slowNode.next!=null) {
            slowNode.next = slowNode.next.next;
        }else{
            slowNode.next=null;
        }
        return head.next;
    }
}*/

//栈
class Solution19 {
    public static ListNode19 removeNthFromEnd(ListNode19 head, int n) {
        ListNode19 dummy = new ListNode19(0, head);
        Deque<ListNode19> nodeStack = new LinkedList<ListNode19>();
        ListNode19 cur = dummy;
        while (cur != null) {//全部入栈
            nodeStack.push(cur);
            cur = cur.next;
        }
        for (int i = 0; i < n; ++i) {//出栈n个节点,后n
            nodeStack.pop();
        }
        ListNode19 prev = nodeStack.peek();//get 倒数第n个前一个
        prev.next = prev.next.next;

        return dummy.next;
    }
}

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

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

相关文章

安装torch-cluster、torch-geometric、torch-scatter、torch-sparse、torch-spline-conv等库

在安装torch-cluster、torch-geometric、torch-scatter、torch-sparse、torch-spline-conv这些库时&#xff0c;要确保所下载的库与自己的torch和CUDA版本相匹配。以下是详细的步骤来找到并安装相应版本的库&#xff1a; 步骤一&#xff1a;首先&#xff0c;我们需要查看当前系…

【LeetCode】27. 消失的数字

题目链接&#xff1a;https://leetcode.cn/problems/remove-element/ &#x1f4d5;题目要求&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;…

HashMap底层源码解析及红黑树分析

HashMap线程不安全&#xff0c;底层数组链表红黑树 面试重点是put方法&#xff0c;扩容 总结 put方法 HashMap的put方法&#xff0c;首先通过key去生成一个hash值&#xff0c;第一次进来是null&#xff0c;此时初始化大小为16&#xff0c;i (n - 1) & hash计算下标值&a…

PWM输入信号转换模拟量电压电流隔离变送器1Hz~10KHz转0-10V/1-5V/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

有什么牌子台灯性价比高?性价比最高的护眼台灯

由心感叹现在的孩子真不容易&#xff0c;学习压力比我们小时候大太多&#xff0c;特别是数学&#xff0c;不再是简单的计算&#xff0c;而更多的是培养学生其他思维方式&#xff0c;有时候我都觉得一年级数学题是不是超纲了。我女儿现在基本上都是晚上9点30左右上床睡觉&#x…

RK3399平台开发系列讲解(FLASH篇)MTD子系统结构

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、什么是MTD二、MTD系统结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux内核对Flash存储器有很好的支持。内核设计了一个MTD(Memory Technology Device,内存技术设备)结构支持F…

平安银行潘多拉指标平台建设案例

潘多拉指标平台是平安银⾏指标管理和指标应⽤的统⼀平台。该平台以业务场景为驱动&#xff0c;提供了 AIBI内容的基础能⼒&#xff0c;并结合组件化开放平台&#xff0c;提供数据分析与应⽤的⼀站式解决⽅案。内容⽅⾯&#xff0c;提供了指标、维度和标签的录⼊、发布和规范化管…

一文看懂数据分析必备计算功能—内存计算

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 接下来&#xff0c;我们准备讲一系列的奥威BI软件的内存计算在各种分析场景中的应用。在正式开讲之前&#xff0c;我先简单说一下…

什么是阻抗?影响阻抗的因素有哪些?

问 什么是阻抗&#xff1f; 答 在具有电阻、电感和电容的电路里&#xff0c;对电路中的电流所起的阻碍作用叫做阻抗。 问 什么是阻抗匹配&#xff1f; 答 阻抗匹配是指信号源或者传输线跟负载之间达到一种适合的搭配。阻抗匹配主要有两点作用&#xff0c;调整负载功率和…

MATLAB函数封装2:QT调用封装函数

在利用MATLAB进行封装函数之后&#xff0c;最主要的目的是对函数进行调用&#xff0c;能够对矩阵运算和其他算法的运行进行快捷处理。 在有了MATLAB函数之后封装成DLL文件之后&#xff0c;在QT中添加动态链接库&#xff0c;就可以实现函数的调用过程&#xff0c;这个过程相对简…

「OceanBase 4.1 体验」OceanBase 4.1社区版的部署及使用体验

「OceanBase 4.1 体验」OceanBase 4.1社区版的部署及使用体验 一、前言1.1 本次实践介绍1.2 本次实践目的 二、准备环境资源2.1 部署前需准备工作2.2 本地环境规划 三、部署Docker环境3.1 安装Docker3.2 配置Docker镜像加速3.3 开启路由转发3.4 重启Docker服务 四、检查本地Doc…

开发者如何成为更好的自己,耐心和观察是关键

个人成长需要有耐心和观察力&#xff0c;这是一个“等待并观察”的视角。个人成长是一个自我提升的过程&#xff0c;需要结合耐心和观察力。这个过程可能会面临挑战&#xff0c;需要花费很多时间和精力&#xff0c;但最终的结果是值得的。耐心和观察是个人成长过程中的两个重要…

windows搭建一个FTP服务器超详细

一.场景&#xff1a; 在开发过程中需要FTP文件上传下载功能&#xff0c;需要在本地或者服务器上搭建一个FTP服务器。 二.详细步骤&#xff1a; 1. 安装FTP服务器支持和配置IIS web服务器 打卡“启动关闭Window功能” 控制面板>程序>启动或关闭Windows功能 或者选择快…

明确自动化测试目的

明确自动化测试目的 1.提高测试人员的工作成就感和幸福感&#xff0c;减少手工测试中重复性的工作 目前&#xff0c;在大部分中小企业中&#xff0c;手工测试在日常测试工作占据的比例很大。测试人员必须跟随开发团队不断地进行选代式开发和测试。一个功能模块可能在整个测试周…

会声会影2023中文旗舰版新增功能讲解及下载更新教程

本次更新不仅带来了标题动作、标题特效、转场特效、音频标记等功能的更新&#xff0c;也增强了热门的GIF创作器、定格动画制作、多语字幕、短时长转场等功能&#xff0c;让大家能体验到更加新潮的视频制作方式。会声会影2023是一款视频编辑软件&#xff0c;由Corel开发。该软件…

【MATLAB数据处理实用案例详解(15)】——利用BP神经网络实现个人信贷信用评估

目录 一、问题描述二、BP神经网络实现个人信贷信用评估原理三、算法步骤3.1 读入数据3.2 划分训练样本与测试样本3.3 样本归一化3.4 创建BP神经网络&#xff0c;并完成训练3.5 测试 四、运行结果 一、问题描述 对个人信用的评估方法主要分为定性评估和定量评估两种&#xff0c…

Oracle中按天、周、月、季、年统计数据

简介: oracle实现按照天、周、月、季、年进行数据统计&#xff0c;在实际业务场景中如 "报表之类" 、"财务业务的往来" 等等&#xff0c;业务往往需要我们统计整年 或 整月的数据等&#xff0c;下面我们直入主题。 说明: 原始数据 一、按天查询 1、片段 …

我们为什么要叫“鲜枣课堂”?

大家好&#xff0c;我是小枣君。 再过几天&#xff0c;就是五月份了。5月19日&#xff0c;对我们来说&#xff0c;是一个重要的日子——“鲜枣课堂”品牌诞生六周年纪念日。 2017年5月19日&#xff0c;我正式确定了“鲜枣课堂”这个品牌命名&#xff0c;并开启了我的创业历程。…

ECF机制:信号处理

​​​​​​​ &#x1f4dc; 本章目录&#xff1a; 0x00 观察接收信号 0x01 阻塞和解除阻塞信号 0x02 安全的信号处理 0x03 在信号处理器中使用安全的 I/O 函数 0x04 便携式信号处理 0x05 显式信号等待 0x00 观察接收信号 假设内核从异常处理程序中返回&#xff0c;并…

多通道 JESD204B接口FMC子卡原理图: 8 通道 125MSPS16 位 AD 采集

板卡概述 FMC129 是一款 8 通道 125MHz 采样率 16 位 AD 采集 FMC子卡&#xff0c;符合 VITA57.1 规范&#xff0c;可以作为一个理想的 IO 模块耦合至 FPGA 前端&#xff0c;8 通道 AD 通过高带宽的 FMC 连接器&#xff08;HPC&#xff09;连接至 FPGA 从 而大大降低了系统信…