【力扣】19. 删除链表的倒数第 N 个结点 <链表指针、快慢指针>

news2024/10/5 11:10:06

【力扣】19. 删除链表的倒数第 N 个结点

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

题解

方法一:两次遍历

  • 先遍历一次链表,求出链表的总长度。
  • 根据总长度 length 的值-n,就算出需要再遍历多少个节点,找到要删除的节点的前一个节点 x。
  • 将 x 节点的 next 指针指向下下一个节点就可以删除节点了。
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val;this.next = next; }
}

public class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if (head == null || n <= 0) {
            return head;
        }
        //增加一个特殊节点,方便边界处理
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode cur = dummyNode;

        //第一次遍历,计算链表总长度
        int length = 0;
        while (cur.next != null) {
            cur = cur.next;
            ++length;
        }
        //如果链表总长度小于n,那就直接返回
        if (length < n) {
            return head;
        }

        //计算第二次遍历多少个节点
        int num = length - n;
        cur = dummyNode;
        //第二次遍历,找到要删除节点的前一个节点
        while (num > 0) {
            cur = cur.next;
            --num;
        }

        //删除节点,并返回
        cur.next = cur.next.next;

        return dummyNode.next;
    }
}

方法二:一次遍历(快慢指针)

需要两个指针 slow 和 fast。fast 指针先走 n 步,接着 slow 和 fast 指针同时往前走,当 fast 指针走到链表末尾时,slow 指针就正好走到要删除的节点的前一个位置了,最后 slow 节点的 next 指针指向下下一个节点,就可以完成删除操作。

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val;this.next = next; }
}

public class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //增加一个特殊节点方便边界判断
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode slow = dummyNode;
        ListNode fast = dummyNode;

        //第一个循环,fast 指针先往前走n步
        while (n > 0 && fast != null) {
            fast = fast.next;
            n--;
        }
        // n > 链表length,fast走n步到尾了,于是后面的判断就不用做了,直接返回
        if (fast == null) {
            return head;
        }

        //第二次,fast、slow指针一起走
        //当遍历结束时,slow指针就指向要删除的节点的前一个位置
        while (fast.next != null) {
            slow = slow.next;
            fast = fast.next;
        }

        //删除节点并返回
        slow.next = slow.next.next;

        return dummyNode.next;
    }
}

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

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

相关文章

【java安全】原生反序列化利用链JDK7u21

文章目录 【java安全】原生反序列化利用链JDK7u21前言原理equalsImpl()如何调用equalsImpl()&#xff1f;HashSet通过反序列化间接执行equals()方法如何使hash相等&#xff1f; 思路整理POCGadget为什么在HashSet#add()前要将HashMap的value设为其他值&#xff1f; 【java安全】…

毫米波雷达 TI IWR6843 官方测试程序(Out Of Box Demo)

1.硬件准备 1.IWR6843AOP板子 2.两个USB转串口模块&#xff08;因为我的是自己做的板子&#xff0c;板子上没有集成USB转串口芯片&#xff09; 2.软件准备 1.最新版本的CCS&#xff0c;注意后缀没有THEIA https://www.ti.com/tool/CCSTUDIO?DCMPdsp_ccs_v4&HQSccs 2.最…

PageObjects支持库-Poium使用方法

PO模式 学过自动化的都知道PageObjects模式&#xff0c;将页面对象封装为类&#xff0c;页面元素和操作封装为类的属性和方法&#xff0c;在测试方法中调用页面对象进行测试。 关于PO模式可见&#xff1a;http://t.csdn.cn/0DBlP 在PO模式下&#xff0c;我们一般定义个一个基…

MacOS上用docker运行mongo及mongo-express

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 前提 要求…

蓝牙资讯|苹果智能戒指专利曝光,可与苹果智能设备进行交互

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果获得了一项智能戒指专利&#xff0c;可以作为 MacBook、电视、AirPods、智能眼镜和 iPhone 等设备的输入交互设备。 苹果在专利中展示了 16 种智能戒指的交互方式&#xff0c;其中图 2 展示了该…

Python高阶技巧 正则表达式

正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是使用单个字符串来描述、匹配某个句法规则的字符串&#xff0c;常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本。 简单来说&#xff0c;正则表达式就是使…

大模型系列|基于大模型复杂数据系统架构(二)

张俊林老师在 2023 WAIC AI 开发者论坛的演讲非常有概括性&#xff0c;这边沿着思路进行一定的整理。&#xff08;文章来源&#xff1a;WAIC 2023 | 张俊林&#xff1a;大语言模型带来的交互方式变革&#xff09; 文章目录 1 PlanningProgramming 模式的系统技术架构2 HuggingG…

运维:18工作中常用 Shell 脚本, 强烈推荐

1、检测两台服务器指定目录下的文件一致性 #!/bin/bash ###################################### 检测两台服务器指定目录下的文件一致性 ##################################### #通过对比两台服务器上文件的md5值,达到检测一致性的目的 dir=/data/web b_ip=192…

el-popover使用自定义图标

使用el-popover实现鼠标点击或浮动到自定义图标上弹出表格弹窗&#xff0c;官方文档上使用的是按钮el-button&#xff0c;如果想换成图标或其他的组件的话直接把el-button替换掉即可。注意替换之后的组件一定要加slot“reference”&#xff0c;不然组件是显示不出来的。 代码如…

数据可视化(六)多个子图及seaborn使用

1.多个子图绘制 #绘制多个子图 #subplot&#xff08;*args&#xff0c;**kwargs&#xff09; 每个subplot函数只能绘制一个子图 #subplots&#xff08;nrows&#xff0c;ncols&#xff09; #fig_add_subplot(行&#xff0c;列&#xff0c;区域) #绘制子图第一种方式 plt.subp…

qq邮箱 会自动拦截 github 邮件,醉了!

今天登录Github&#xff0c;修改密码&#xff0c;qq邮箱一直收不到Github的邮件 打开自助查询一看&#xff0c;自助查询在右边栏 为什么steam登陆 qq邮箱收不到验证码了&#xff1f; - 知乎 点击左上角设置&#xff0c;点击反垃圾&#xff0c;点击设置右键地址白名单 然后就可…

恒运资本:满仓的含义?

满仓&#xff0c;望文生义&#xff0c;便是财经领域中的一个术语。它指的是出资者将一切可用资金悉数用于购买股票、基金或其他金融资产。满仓的意义是出资者对某种出资产品充满决心&#xff0c;并乐意将自己的大部分资金投入其中&#xff0c;以希望取得更高的报答。但是&#…

Mongodb安装(Centos7)

1. 下载 MongoDB: The Developer Data Platform | MongoDB 2. 安装 上传至服务器 解压 tar -zxvf mongodb-linux-x86_64-rhel70-5.0.19.tgz 移动 mv mongodb-linux-x86_64-rhel70-5.0.19 /usr/local/mongodb 3. 配置 vim /etc/profile # set mongodb configuration expor…

shell centos 7 一键部署 KVM软件脚本

这个脚本有限地方还需要完善下 设计思路&#xff1a; 1、创建检查内核函数 check_kernel() 2、创建升级内核函数 update_kernel() 3、创建检查是否支持虚拟化函数 check_virtual() 4、创建检查操作系统函数 check_system() 5、创建检查网络函数 check_network() 6…

安防视频汇聚平台EasyCVR视频广场面包屑侧边栏支持拖拽操作

智能视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将海量设备实现集中统一接入与汇聚管理&#xff0c;实现视频的处理与分发、录像与存储、按需调阅、平台级联等。 TSINGSEE青犀视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协…

实例029 半透明渐显窗体

实例说明 很多专业软件在启动前都会显示一个说明该软件信息或用途的窗口&#xff0c;有的则是一个漂亮的启动界面&#xff0c;如Adobe公司的Acrobat。该窗口使软件显得更加专业。本例将实现一个半透明的渐显窗体&#xff0c;运行本软件会显示一个启动画面&#xff0c;并且画面…

【大招:谨慎使用】如果Git上传,pull总是有冲突而且无法解决

目录 1.先去当前项目文件夹&#xff0c;拷贝一份项目作为备份。 2.右键运行Git Bash 3.把刚才备份的项目文件夹中&#xff0c;自己的代码&#xff0c;拷贝到覆盖后文件夹里&#xff0c;并替换。 4.打开idea&#xff0c;进到项目里。把代码重新push。按如下操作&#xff1a; …

AI人工智能到底会如何发展,有没有哪些是确定的将来?

自从 chatGPT 发布&#xff0c;Ai的未来难以预测&#xff0c;但过往清晰可见&#xff0c;我们从过去大胆推测一下未来。 1950年&#xff0c;图灵提出了"图灵测试"&#xff0c;作为衡量机器是否具有人类智能的标准。 2016年&#xff0c;DeepMind的AlphaGo战胜了围棋世…

Qt实现自定义QDoubleSpinBox软键盘

在Qt应用程序开发中&#xff0c;经常会遇到需要自定义输入控件的需求。其中&#xff0c;对于QDoubleSpinBox控件&#xff0c;如果希望在点击时弹出一个自定义的软键盘&#xff0c;以便用户输入数值&#xff0c;并将输入的值设置给QDoubleSpinBox&#xff0c;该如何实现呢&#…

35.利用fminsearch解 多元变量无约束条件下的函数最小值(matlab程序)

1.简述 1.fminsearch函数基本语法 函数功能&#xff1a;使用无导数法计算无约束多变量函数的最小值 语法 x fminsearch(fun,x0) x fminsearch(fun,x0,options) x fminsearch(problem) [x,fval] fminsearch(___) [x,fval,exitflag] fminsearch(___) [x,fval,exitflag,out…