【数据结构与算法】力扣 19. 删除链表的倒数第 N 个结点

news2024/12/23 5:11:15

题目描述

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

分析解答

第一眼:这不删除节点吗?我会!

再看一眼:哎呦不对!是倒数第 n 个节点。

然后:emmm,这不一个道理吗!

所以我的思路就是先将倒序转化为正序,用正序的思路去删。如果正序为第 x 个,倒序为第 n 个,那么找找规律就可以发现 x = length + 1 - n

为了方便,依旧是引入虚拟头节点,既然要删第 x 个,那么就去找第 x - 1 个。

然后,既然没有 length,那就求呗。

let dummyHead = new ListNode(0, head)
let length = 0
while (dummyHead.next != null) {
    length++
    dummyHead = dummyHead.next
}
dummyHead = new ListNode(0, head)

之后的操作就一个非常普通的删除节点操作。

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function (head, n) {
    let dummyHead = new ListNode(0, head)
    let length = 0
    while (dummyHead.next != null) {
        length++
        dummyHead = dummyHead.next
    }
    dummyHead = new ListNode(0, head)
    if ((length + 1 - n) == 1) {
        head = head.next;
    }
    if ((length + 1 - n) == 2) {
        dummyHead.next.next = dummyHead.next.next.next
    }
    if ((length + 1 - n) >= 3) {
        for (let i = 1; i < (length + 1 - n); i++) {
            dummyHead = dummyHead.next;
        }
        dummyHead.next = dummyHead.next.next
    }
    return head
};

思路拓展

大家可以想一想,倒数第 n 个和正序的第 n 个有什么相同之处捏?

对了!就是首(假设为双向链表)尾都是 null!从头往后数和从尾往前数不一个道理吗?

image.png

所以思路就是找一对双指针 fast 和 slow,他们在维持一定的位移差的情况下同时移动,fast 一直指到 null(尾),而 slow 刚好是 fast 后面的第 n + 1 个元素,第 n 个刚好是要删除的元素。

image.png

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    let ret = new ListNode(0, head)
    let slow = ret;
    let fast = ret;
    // fast 和 slow 指针差 n + 1
    n++;
    while (n-- && fast) fast = fast.next;
    while (fast) {
        fast = fast.next;
        slow = slow.next;
    }
    slow.next = slow.next.next;
    return ret.next;
};

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

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

相关文章

说说TCP为什么需要三次握手和四次挥手?

一、三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包 主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备 过程如下&#xff…

成为一个ATE工程师是什么体验?

当你成为ATE工程师&#xff0c;是什么感受&#xff1f; 按照业内资深工程师的玩笑话来说&#xff1a;整的是比劳斯莱斯还贵的设备&#xff0c;更高端的机台顶得起上海几套房。 1、什么是ATE测试&#xff1f; 一颗芯片的生命周期始于市场需求&#xff0c;从产品的定义与设计&…

nodejs应用程序以守护进程daemon的方式启动,容器化部署的时候一直部署出错,导致无法成功启动程序。

一、背景 nodejs应用程序使用Egg.js 框架脚本命令&#xff0c;见package.json&#xff1a; "scripts": {"debug": "egg-bin debug","clean": "easy clean","build": "easy build prod","start&…

【漏洞复现】爱数云盘 Usrm_GetAllUsers 未授权访问漏洞

0x01 产品简介 爱数云盘是一个为企业协作提供高效的文档办公服务的企业云盘&#xff0c;主要是做私有云文件管理服务。 0x02 漏洞概述 爱数 AnyShare存在未授权漏洞&#xff0c;未授权的攻击者可以通过该漏洞获取用户名信息。 0x03 测绘语句 fofa: app"AISHU-AnyShare…

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架&#xff0c;它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发&#xff0c;主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较&#xff0c;帮助你做出决策&#xff1a; Vue 2&#xff1…

MPT - 初识账户状态树(World State)

往期回顾 ETH网络中的账户ETH网络中的区块链 通过以上文章&#xff0c;我们了解到ETH网络中的World State是节点根据交易维护的&#xff0c;节点在维护Wrold State时为了方便操作会将用户状态构建成一颗树&#xff0c;称为账户状态树&#xff0c;采用一种叫做MPT的数据结构 MP…

一带一路故事绘|亚的斯亚贝巴友谊广场的绿色变迁

这是2月18日在埃塞俄比亚首都亚的斯亚贝巴友谊广场拍摄的景色。 新华社记者 李亚辉 摄 一带一路故事绘&#xff5c;亚的斯亚贝巴友谊广场的绿色变迁 援埃塞俄比亚河岸绿色发展项目是中国政府援建的市政园林类项目&#xff0c;是落实中非合作论坛北京峰会“八大行动”倡议“绿…

Python基于深度学习的屋内烟雾检测系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

纯CSS实现未读消息显示99+

在大佬那看到这个小技巧&#xff0c;我觉得这个功能点还挺常用&#xff0c;所以给大家分享下具体的实现。当未读消息数小于100的时候显示准确数值&#xff0c;大于99的时候显示99。 1. 实现效果 2. 组件封装 <template><span class"col"><sup :styl…

【GIS前言技术】今年全球唯一一次日全食要来了!

今年全球唯一一次日全食将于北京时间4月9日凌晨上演&#xff0c;全食带扫过北美洲&#xff0c;墨西哥、美国和加拿大的众多城市都能看到这次日全食&#xff0c;发生时间为当地时间4月8日中午到下午&#xff0c;观赏性比较强。 日全食&#xff08;Eclipse&#xff09;是日食的一…

论文阅读——MVDiffusion

MVDiffusion: Enabling Holistic Multi-view Image Generation with Correspondence-Aware Diffusion 文生图模型 用于根据给定像素到像素对应关系的文本提示生成一致的多视图图像。 MVDiffusion 会在给定任意每个视图文本的情况下合成高分辨率真实感全景图像&#xff0c;或将…

Solo 开发者周刊 (第10期):Sora 之后,谁是被遗忘的?谁又是被仰望的?

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿&#xff0c;每周五发布。在这期周刊中&#xff0c;我们将深入探讨开源软件产品的开发旅程&#xff0c;分享来自一线独立开发者的经验和见解。本杂志开源&#xff0c;欢迎投稿。 好文推荐 Solo 社区 x 机器之心-再谈复现 …

设置模式——备忘录模式

备忘录模式 备忘录模式&#xff08;Memento Design Pattern&#xff09;&#xff0c;也叫快照&#xff08;Snapshot&#xff09;模式。指在不违背封装原则前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便之后恢复对象为先前…

【Linux】指令

1. 简单指令 whoami 显示当前登入账号名 ls /home 现在有的用户名 adduser 用户名 新加用户&#xff08;必须在root目录下&#xff09; passwd 用户名 给这个用户设置密码 userdel -r 用户名 删除这个用户 pwd 显示当前所处路径 stat 文件名 / 文件夹名 显示文件状…

【Linux网络编程】网络编程套接字(TCP服务器)

【Linux网络编程】网络编程套接字(TCP服务器) 目录 【Linux网络编程】网络编程套接字(TCP服务器)地址转换函数关于inet_ntoa 简单的TCP网络程序TCP sockot API详解socket()bind()listen()accept();connect 完整的TCP服务器代码&#xff08;线程池版&#xff09; 作者&#xff1…

云谈网页聊天室的web自动化测试 性能测试 (包含测试代码和测试的详细过程)

概要 项目名称&#xff1a;云谈网页聊天室测试日期&#xff1a;2024-03-05测试人员&#xff1a;汪汪miao~测试类型&#xff1a;功能测试、集成测试&#xff0c;接口测试、性能测试测试框架&工具&#xff1a;Selenium、Junit、LoadRunner 项目背景 云谈网页聊天室是一款实…

【算法】两数之和(暴力求解+哈希表)

本题来源---《两数之和》。 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里…

OPPO云VPC网络实践

1 OPPO 云网络现状 随着OPPO业务的快速发展&#xff0c;OPPO云规模增长迅速。大规模虚拟实例的弹性伸缩、低延时需求对网络提出了诸多挑战。原有基于VLAN搭建的私有网络无法解决这些问题&#xff0c;给网络运维和业务的快速上线带来了挑战。 梳理存在的主要问题如下&#xf…

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1&#xff0c; redis cluster 是什么 2&#xff0c;redis 集群的组成 3&#xff0c;集群的作用 4&#xff0c;集群架构图 二 Redis集群的数据分片 1&#xff0c;哈希槽是什么 2&#xff0c;哈希槽如何排布 3&#xff0c;Redis集…