【LeetCode-中等题】19. 删除链表的倒数第 N 个结点

文章目录

    • 题目
    • 方法一:节点加入集合找索引
    • 方法二:直接计算长度,然后找出要删除的节点的前一个节点
    • 方法三:栈
    • 方法四:前后双指针

题目

这题的关键在与两个点

  1. 一定要设置一个哑结点,防止删除第一个元素时,导致空指针异常
    在这里插入图片描述

  2. 删除链表的元素其实就等价于找到这个元素的前一个元素
    在这里插入图片描述

在这里插入图片描述

方法一:节点加入集合找索引

在这里插入图片描述

先将ListNode存到list 然后直接找到要删除节点的前一个节点即可(node.next = node.next.next)

  public static ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode pre = new ListNode(0, head);//创建哑结点  解决要删除的元素时第一个 空指针异常
            List<ListNode> list = new ArrayList<>();
            //将链表节点存到list
            ListNode h = pre;
            while(h != null){
                list.add(h);
                h = h.next;
            }
            //找到要删除的数的前一个节点
            ListNode node = list.get(list.size()-1-(n-1)-1);
            node.next = node.next.next;
            return pre.next;
          
        }

方法二:直接计算长度,然后找出要删除的节点的前一个节点

在这里插入图片描述

       public static ListNode removeNthFromEnd(ListNode head, int n) {
               //得出链表的长度
               int length   =  getLength(head);
               ListNode pre = new ListNode(0, head);//创建哑结点  解决要删除的元素时第一个 空指针异常
               //倒数n个 为  length - n + 1
               int l = length - n + 1;
               ListNode cur = pre;
               for (int i = 1; i < l ; i++ ) {
                    cur = cur.next;
                }
                cur.next = cur.next.next;
                return pre.next;

            }

            //计算链表长度
            public static int getLength(ListNode head){
                int len = 0;
                while(head !=null){
                    len ++;
                    head = head.next;
                }
                return len;
            }

方法三:栈

依次入栈,直到null 然后要删除的元素 n = 多少 就弹出对少元素 弹出的元素就是要删除的元素 例如找n=1 倒数第一个 则直接弹出栈顶元素删除即可

此时当弹出n个数之后 ,此时栈顶其实就是要删除的数的前一个数了,也满足将删除链表元素转换为找到要删除元素的前一个元素

在这里插入图片描述

   public static ListNode removeNthFromEnd(ListNode head, int n) {
           ListNode dummy = new ListNode(0, head);//哑结点  删除第一个元素空指针异常
           Deque<ListNode> stack = new LinkedList<ListNode>(); //栈
           ListNode cur = dummy;
           while (cur != null) {
            stack.push(cur);
            cur = cur.next;
        }
        for(int i = 0; i<n ; i++){
            stack.pop();//弹出对应的栈顶元素  最后弹出的元素就是要删除的元素
        }
            //此时要删除的前一个元素时栈顶元素
            ListNode pre = stack.peek();
            pre.next = pre.next.next;
            return dummy.next;

        }

方法四:前后双指针

关键在于指针的设置,fast起始就比slow快一个节点,然后按照n=? fast往前移动?个位置,然后再slow和fast同步移动,直到fast走到null,此时slow指向的就是要删除元素的前一个位置(也就是为什么开始就要fast比slow快一个位置的原因,不然等fast走到null了,结果slow指向的要删除的元素,这样不太好执行node.next = node.next.next操作,因为删除链表的元素其实就等价于找到这个元素的前一个元素)

在这里插入图片描述

    public static ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);//哑结点  防止删除第一个元素空指针异常
        ListNode  fir = head;
        ListNode  bef = dummy;
        //先指针领先 bef  n 个位置
        for(int i=0;i<n;i++){
            fir = fir.next;
        }
        //当 fir遍历到链表的末尾时, bef的下一个节点就是我们需要删除的节点。
         while(fir !=null){
            fir =fir.next;
            bef = bef.next;
        }
        bef.next = bef.next.next;
        return dummy.next;

        }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何利用SFTP协议远程实现更安全的文件传输 ——【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 1. 安装openSSH1.1 安装SSH1.2 启动ssh 2. 安装cpolar2.1 配置termux服务 3. 远程SFTP连接配置3.1 查看生成的随机公…

算法训练阶段总结

目录 0 前置 1 内容回顾 学习组合拳 对复杂度的认识 数据结构&#xff1a; 数组&#xff1a;Array 链表&#xff1a;List 哈希表&#xff1a; 字符串&#xff1a; 栈与队列&#xff1a; 二叉树&#xff1a; 回溯&#xff1a; 贪心&#xff1a; 动态规划&#xff…

java八股文面试[JVM]——类加载器

一、类加载器的概念 类加载器是Java虚拟机用于加载类文件的一种机制。在Java中&#xff0c;每个类都由类加载器加载&#xff0c;并在运行时被创建为一个Class对象。类加载器负责从文件系统、网络或其他来源中加载类的字节码&#xff0c;并将其转换为可执行的Java对象。类加载器…

vscode调试PHP代码

目录 准备工作ssh的连接以及配置调试 准备工作 1.首先你需要下载一个vscode 2.下载模块 你需要在VScode中去下载我们所需的两个模块PHP Debug以及remote -ssh 3.安装对应版本的xdebug 需要在xdebug的官方去进行分析&#xff0c;选择适合你自己版本的xdebug 去往官方&#x…

springCloud整合Zookeeper的时候调用找不到服务

SpringCloud整合Zookeeper的时候调用找不到服务 首先&#xff0c;我们在注册中心注册了这个服务&#xff1a; 然后我们使用RestTemplate 调用的时候发现失败了&#xff1a;找不到这个服务&#xff1a; 找了很多资料发现这个必须要加上负载才行 BeanLoadBalanced //负载publi…

国产化-银河麒麟V10系统及docker的安装

一、最近在研究国产化操作系统&#xff0c;“银河麒麟V10”&#xff0c; 在我电脑本机vmware 15的虚拟机中进行安装测试&#xff1b; 1.点击这里提交产品试用申请&#xff0c;不过只需要随便输入&#xff0c;手机号验证码验证后方可跳转至下载地址产品试用申请国产操作系统、银…

《中国区块链发展报告(2023)》发布 和数集团推动区块链发展

北京区块链技术应用协会与社会科学文献出版社日前在京共同发布《区块链蓝皮书&#xff1a;中国区块链发展报告&#xff08;2023&#xff09;》。蓝皮书归纳梳理了2022年区块链产业发展现状及趋势&#xff0c;并结合行业热点Web3.0、AIGC&#xff0c;探讨我国区块链发展的热点话…

智能客服系统:解决企业服务、管理难题的新选择

在数字化时代&#xff0c;智能客服系统是企业服务、管理的新选择。智能客服系统可以通过自然语言处理、人工智能等技术实现与顾客的智能对话&#xff0c;提升企业客服效率和服务质量。同时&#xff0c;智能客服系统也可以为企业提供实时数据分析和监管&#xff0c;进一步优化管…

专访 Hyper Oracle:可编程的 zkOracle 打造未来世界的超算

许多 Web3 应用在实现的过程中&#xff0c;常常会遇到基础设施方面的限制&#xff0c;包括去中心化自动化、预言机、链上信息搜索等问题。绝大部分区块链的中间件网络都是依赖于节点质押来保证节点执行的诚实性&#xff0c;这样的模式会产生诸多衍生问题&#xff0c;例如安全性…

【Java基础】Java注解与反射

文章目录 ⭐️写在前面的话⭐️1、什么是注解&#xff1f;注解的分类常用的Java注解 2、元注解TargetRetentionDocumentedInherited 3、自定义注解Override注解的基本格式 4、什么是反射&#xff1f;什么时候需要用到反射&#xff1f;反射的应用场合 5、反射的原理6、反射机制的…

CSS中如何实现元素之间的间距(Margin)合并效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 外边距合并的示例&#xff1a;⭐ 如何控制外边距合并&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff…

跳跃游戏【贪心算法】

跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。在这里插入图片…

美创科技“签”手柠檬文才学堂,共推高校数据安全建设

近日&#xff0c;由柠檬文才学堂联合中国教育在线、东北财经大学网络教育学院共同主办的“三教统筹下高校继续教育数字化转型研讨”顺利召开。 国内高等院校&#xff08;高职院校&#xff09;继续教育分管领导&#xff0c;继续教育学院领导及继续教育信息化、教学教务管理、课程…

『PyQt5-基础篇』| 05 Qt Designer保存的.ui文件如何生成.py文件?

05 Qt Designer保存的.ui文件如何生成.py文件? 1 使用Qt Designer设计一个简单的界面2 UI文件转PY文件2.1 方法一:直接使用命令2.2 方法二:直接调用PyUIC5工具3 运行转换后的py文件.ui文件是用Qt Designer设计的界面保存后的文件;保存后我们需要把这个文件转换成.py 文件,…

JavaSE 集合框架及背后的数据结构

目录 1 介绍2 学习的意义2.1 Java 集合框架的优点及作用2.2 笔试及面试题 3 接口 interfaces3.1 基本关系说明3.2 Collection 常用方法说明3.3 Collection 示例3.4 Map 常用方法说明3.5 Map 示例 4 实现 classes5 Java数据结构知识体系5.1 目标5.2 知识点 1 介绍 集合&#xf…

使用Rust开发命令行工具

生成二进制文件&#xff0c;将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具[1] 找到合适的API 使用该api[2] 如请求 api.openweathermap.org/data/2.5/weather?qBeijing&appidyour_key: { "coord": { "lon": 116.3972, "lat&quo…

【学习笔记】求解线性方程组的G-S迭代法

求解线性方程组的G-S迭代法 // 运行不成功啊function [x,k,index] Gau_Seid(A,b,ep,it_max) % 求解线性方程组的G-S迭代法&#xff0c;其中 % A为方程组的系数矩阵 % b为方程组的右端项 % ep为精度要求&#xff0c;省缺为1e-5 % it_max为最大迭代次数&#xff0c;省缺为100 % …

基于Android的课程教学互动系统 微信小程序uniapp

教学互动是学校针对学生必不可少的一个部分。在学校发展的整个过程中&#xff0c;教学互动担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类教学互动程序也在不断改进。本课题所设计的springboot基于Android的教学互动系统&#xff0c;使用SpringBoot框架&am…

threejs纹理加载三(视频加载)

threejs中除了能把图片作为纹理进行几何体贴图以外&#xff0c;还可以把视频作为纹理进行贴图设置。纹理的类型有很多&#xff0c;我们可以用不同的加载器来加载&#xff0c;而对于视频作为纹理&#xff0c;我们需要用到今天的主角&#xff1a;VideoTexture。我们先看效果&…

虚幻官方项目《CropOut》技术解析 之 在实战中理解Enhanced Input系统

文章目录 概要Enhanced Input系统基础回顾旧版输入系统定义物理按键和Action/Axis的映射输入事件 Enhanced Input系统统一的ActionInput Mapping Context输入事件 《Crop Out》《Crop Out》中基于Enhanced Input的输入控制系统Input Mapping Context分层管理输入修改器(Input M…