手撸代码-删除链表的倒数第n个节点

2023-10-27

描述

给定一个链表,删除链表的倒数第 nn 个节点并返回链表的头指针
例如,
给出的链表为: 1→2→3→4→5, n= 2n=2.
删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.

备注:

题目保证 nn 一定是有效的
请给出时间复杂度为 O(n) 的算法

解法一:

将链表存入Map中,通过索引快速找到要删除的结点,要注意头尾结点的删除的特殊性

public ListNode removeNthFromEnd (ListNode head, int n) {
        // write code here
        Map<Integer,ListNode> nodes = new HashMap<>();
        ListNode tmp = head;
        int idx = 0;
        while(tmp != null) {
            nodes.put(idx++, tmp);
            tmp = tmp.next;
        }
        
        // 删除头节点,注意只有一个节点的链表
        int idx2Del = idx - n;
        if (idx2Del == 0 && idx > 1) {
            return nodes.get(1);
        } else if (idx2Del == 0) {
            return null;
        }
        
        ListNode nodePre = nodes.get(idx2Del-1);
        
        // 如果删除的是尾节点
        ListNode nodeNext = null;
        
        // 如果不是尾节点
        if (n > 1) {
            nodeNext = nodes.get(idx2Del+1);
        }
        
        nodePre.next = nodeNext;
        return nodes.get(0);
        
    }

解法二:

  • 1,双指针,先移动fast指针,使其与slow指针相差n个结点
  • 2,slow最终指向要删除的结点的前一个结点,fast指向尾结点
  • 3,临界点的考虑非常重要:只有一个结点,只有两个结点,如果删除的是头结点,如果删除的是尾结点
        ListNode slow = head;
        ListNode fast = head;
        int idx = 0;
        while(fast.next != null) {
            if (idx++ < n) {
                fast = fast.next;
            } else {
                slow = slow.next;
                fast = fast.next;
            }
        }
       
        // 如果是删除头节点
        if (idx + 1 == n) {
            return slow.next;
        }
        
        // 如果是删除其他节点
        slow.next = slow.next.next;
       
        return head;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手撸代码-删除链表的倒数第n个节点 的相关文章

  • 使用 WebDriver 单击新打开的选项卡中的链接

    有人可以在这种情况下帮助我吗 场景是 有一个网页 我仅在新选项卡中打开所有指定的链接 现在我尝试单击新打开的选项卡中的任何一个链接 在下面尝试过 但它仅单击主 第一个选项卡中的一个链接 而不是在新选项卡中 new Actions drive
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • Java:从集合中获取第一项

    如果我有一个集合 例如Collection
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • k8s中的有状态,无状态,pv、pvc等

    数据库是一个典型的有状态服务 他的部署和无状态服务是不一样的 PostgresSQL 基于Kubernetes部署PostgresSQL CSDN博客 一 创建SC PV和PVC存储对象 二 部署PostgresSQL Volume Kub
  • dell进入u盘启动模式_uefi不识别u盘怎么办 uefi不识别u盘方法【图文详解】

    现代的电脑配置更新换代都很频繁 从以前的bios主板到现在的uefi主板配置都有很大的进步 而这种新型uefi配置也给新用户装系统带来麻烦 有些用户用u盘启动盘装系统发现uefi不识别u盘 uefi bios识别不了u盘的原因其实就是Lau
  • layui+poi-Java实现导入导出excel文件

    目录 需求说明 一 实现思路 二 前端代码 1 引入layui 2 隐藏部分内容 1 静态页面代码 2 js jquery 代码 点击 导入xx 按钮的js 弹出上面隐藏的内容 3 效果如下 3 下载模板js 4 选择文件 上传js 三 后
  • STM32USB的枚举过程简介

    STM32的USB枚举过程介绍 之前的说明 文中大量引用网上资料 在文后已给出资料的引用说明 文件涉及到的USB各种传输包各个位的含义以及USB标准设备请求的含义都没有做说明 推荐看 圈圈教你玩USB 里面有详细的说明 一 枚举前的工作 系
  • 034_非关系型数据库Redis_安装配置 & 基础语法 & Python交互

    文章目录 1 认识Redis 2 Redis 安装和配置 3 Redis 数据类型 4 Redis 内置指令 5 Redis 配置文件 远程登陆 6 Redis 应用场景 6 1 Redis 应用 手机手机验证码 6 2 Redis 应用
  • 【系统分析师之路】第七章 复盘系统设计(面向服务开发方法)

    系统分析师之路 第七章 复盘系统设计 面向服务开发方法 复盘系统设计 面向服务开发方法 系统分析师之路 第七章 复盘系统设计 面向服务开发方法 前言部分 历年真题考点分析 1 考点分析 2 重要知识点 第一部分 综合知识历年真题 2008下
  • ucint核心边缘分析_社会网络分析中核心边缘分析的简单教程

    最近碰到一位朋友在留言向我咨询如何用社会网络分析进行核心边缘分析 因此 根据这位朋友提供的数据 简单的操作了一下 并制作成教程 分析了可能存在的问题 教程如下 1 打开软件 2 点击上图表格 通过复制 粘贴输入数据 并保存至某一文件夹 3
  • python 字典

    字典的特征 1 字典中数据必须是以键值对的形式出现的 2 键不能重复 而值可以 3 字典中的键是不能修改的 而值是可以修改的 可以为任何对象 因此键不能用变量 字典的书写范例 dictory 猫 cat 狗 dog 狼 holf print
  • jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)

    需求 1 开发在哪个分支上提交代码 jenkins就自动发布相对应的分支 2 实现既能手动发布jenkins 也要实现自动webhook发布 约定 和开发约定分支对应的环境 比如 debug对应开发环境 develop对应测试环境 mast
  • 【Fastdfs】通过 docker 快速搭建集群 fastdfs 环境

    Fastdfs 通过 docker 快速搭建集群 fastdfs 环境 1 镜像构建 码云地址 https gitee com hbsky fastDFS 构建新的镜像 使用我的镜像也行 docker build t registry cn
  • dlink网络打印服务器如何修改ip地址,如何使用脚本更改网络打印机的IP地址?

    HI 大家好 现在的客户端全部基于WIN XP WIN7 都连接着一台HP 4650网络打印机 IP ADDRESS 10 201 0 1 但是最近打印机IP做了整体的调整 如何实现用脚本更改以前的IP呢 我试过以下的脚本 但是只有添加TC
  • keil5中Undefined symbol XXX 的解决方法

    keil5中Undefined symbol XXX 的解决方法 OBJ LED axf Error L6218E Undefined symbol SPI Cmd referred from spi o OBJ LED axf Error
  • 库存预占架构升级方案设计-交易库存中心

    背景介绍 伴随物流行业的迅猛发展 一体化供应链模式的落地 对系统吞吐 系统稳定发出巨大挑战 库存作为供应链的重中之重表现更为明显 近三年数据可以看出 接入商家同比增长37 64 货品种类同比增长53 66 货品数量同比增长46 43 仓库数
  • 人工智能发展情况调研

    人工智能发展情况调研Artificial intelligence development circumstance investigation北京师范大学继续教育学院 2000级计算机科学与技术 赵旭峰E mail zxf95 163 c
  • Excel中如何找出两列数据中相同的数据,并且进行同行显示

    使用VLOOKUP方法即可 VLOOKUP A2 Sheet1 B C 1 0 的含义是 在sheet1工作表的B C区域的首列中查找等于a2的值 找到后 返回该区域的同行的值 最后的参数0表示精确查找 比如 想要列2根据列1中的数据进行排
  • PG概述及OSD对PG状态的影响

    前言 随着分布式存储的广泛应用 目前对PG的关注越来越多 本文基于ONStor分布式存储系统简要介绍一下PG的状态变化 重点说明OSD对PG状态的影响 一 Ceph分布式存储概述 Ceph是一个统一的分布式存储系统 设计初衷是提供较好的性能
  • Gazebo中特异性里程计odom的发布

    需求 将里程计 odom改成以小车初始位置为原点 车体坐标轴为方向建立坐标系 用该坐标系下的位姿作为里程计数据的位姿 分析 odom是ros发布的相对固定的里程计信息 不能使用命令行工具直接修改里程计信息参考的初始位置 因此 从 odom坐
  • QT5 创建“打开文件”按钮

    在GUI界面设计中 有时需要 打开文件 按钮 以加载外部文件 则需要我们用QFileDialog的静态函数完成 QT5中几个文件相关函数如下 函数名 作用 getOpenFileName 加载用户选择文件的文件名 getSaveFileNa
  • Java函数、数组

    Java函数 数组 函数 函数 就是定义在类中的具有特定功能的一段独立小程序 格式 修饰符 返回值类型 函数名 参数类型 参数1 参数类型 参数2 执行语句 return 返回值 返回值类型 函数运行后的结果的数据类型 参数类型 是形式参数
  • 手撸代码-删除链表的倒数第n个节点

    描述 给定一个链表 删除链表的倒数第 nn 个节点并返回链表的头指针 例如 给出的链表为 1 2 3 4 5 n 2n 2 删除了链表的倒数第 n 个节点之后 链表变为1 2 3 5 备注 题目保证 nn 一定是有效的 请给出时间复杂度为