【面试经典 150 | 链表】删除链表的倒数第 N 个结点

news2024/11/25 16:55:30

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:统计节点个数
    • 方法二:双指针
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【链表-删除节点】【迭代】


题目来源

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


解题思路

方法一:统计节点个数

思路

一种朴素的方法是首先统计链表中节点的个数 m,倒数第 n 个节点就是正数第 m - n + 1 个节点。我们从头结点开始,找到正数第 m - n 个节点(要删除节点的前一个节点),直接将该节点的指针指向下下个节点即可。

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    const int getLength(ListNode* head) {
        int len = 0;
        while (head) {
            ++len;
            head = head->next;
        }
        return len;
    }

    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode(0, head);
        int m = getLength(head);
        ListNode* cur = dummy;
        for (int i= 0; i < m - n; ++i) {
            cur = cur->next;
        }
        cur->next = cur->next->next;
        return dummy->next;
    }
};

复杂度分析

时间复杂度: O ( m ) O(m) O(m) m m m 为链表的长度。

空间复杂度: O ( 1 ) O(1) O(1)

方法二:双指针

思路

我们先用一个指针指向链表的第 n 个节点,此时增加另一个指针指向头结点,接着让两个指针同时向链表尾部移动,每一移动一个位置,当第一个指针到达 nullptr 时,我们也就找到了需要删除的节点。

如果我们利用 代码 中的 while 循环就找到了要删除节点的上一个节点,此时直接将该节点的指针指向下下个节点即可。

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *first = head;
        ListNode *dummy = new ListNode(0, head);
        ListNode *second = dummy;

        for(int i = 0; i < n; ++i)
            first = first->next;
        
        while(first){
            first = first->next;
            second = second->next;
        }
        second->next = second->next->next;
        return dummy->next;
    }
};

复杂度分析

时间复杂度: O ( m ) O(m) O(m) m m m 为链表的长度。

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

官方助力:SpringAI快速尝鲜体验(SpringBoot3+Gradle8+JDK17)

SpringAI 自从OpenAI的ChatGPT爆火之后&#xff0c;各种AI大模型开始席卷互联网&#xff0c;作为知名框架的Spring官方也是小小的顺应了一波潮流&#xff0c;就在不久前官方推出了针对AI的部分&#xff0c;称为SpringAI目前最新版本为0.8.1,下面是官网的截图。 直通车https:/…

第十二章 屏幕后处理效果

屏幕后处理效果是实现屏幕特效的常见方法。 建立一个基本的屏幕后处理的脚本 屏幕后处理指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。 想要实现屏幕后处理的基础在于抓取屏幕。Unity为我们提供了一个接口-OnRenderImage函数。 声…

学习笔记<2024.4.15-2024.4.21>:Attention Is All You Need

Transformer中Self-Attention以及Multi-Head Attention详解 (https://www.bilibili.com/video/BV15v411W78M/?spm_id_from333.337.search-card.all.click&vd_sourcef32decb03075b4a1833fe5c47c11ba94)

什么是CPU与GPU,它们之间有什么关系

什么是CPU与GPU&#xff0c;它们之间有什么关系一、CPU1. 核心功能2. 工作原理3. 组成部分4. 发展历程5. 性能指标6. 架构种类7. 发展趋势8. 应用领域 二、GPU三、CPU与GPU的关系 什么是CPU与GPU&#xff0c;它们之间有什么关系 一、CPU CPU&#xff0c;全称是“Central Proc…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库&#xff0c;具有分布式计算、事务支持、多模存储、以及流批一体等能力&#xff0c;非常适合作为一款理想的轻量级大数据平台&#xff0c;轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式&#xff0c;介绍如何通过 Dolphin…

uni-app项目引入阿里巴巴矢量图标库

uni-app项目引入阿里巴巴矢量图标库 1.下载图标库中的symbol下载至本地 2.解压文件夹并放入项目中 我这里放入的位置是src/static/icon目录下 3.修改文件指向路径为相对路径 即在路径iconfont前面添加斜杠 4.app.vue的style中引入 import static/icon/iconfont.css; 5…

支付宝下载饮品优惠券信息

日常场景 1&#xff1a;一个吃货奶茶瘾犯了&#xff0c;想喝点奶奶&#xff0c;想喝coco、书逸烧仙草、一点点。喝奶茶还想省点钱&#xff0c;看看哪个品牌优惠力度最大&#xff0c;支付宝一个一个搜索好麻烦啊~~~~~~ 2&#xff1a;某饮品品牌的营销&#xff0c;想了解目前市…

UKP3d,AutoPDMS设置埋地数据导出至AutoPSA的查看方法

一用户在设置了埋地数据&#xff0c;导出至AutoPSA未有数据。具体操作方法如下&#xff1a; AutoPSA里提供两种埋地计算&#xff0c;一是仿start计算&#xff1b;二是仿CII计算 1.AutoPSA10.0仿start计算新埋地模块的操作方法&#xff1a; AutoPSA10.0新埋地模块需要用户根据实…

预算不足千元SSL证书该怎么选?

随着互联网安全概念日渐深入人心&#xff0c;越来越多的企业或个人为自己的网站加装SSL证书&#xff1b;那对于个人或者小小微企业&#xff0c;预算不足千元的情况下该怎么选择SSL证书呢&#xff1f;可以从以下几个方面进行考量&#xff0c;以确保在有限的预算内获得满足基本安…

makefile第七讲

更多精彩内容在公众号。 当make执行完后&#xff0c;我们期望将最终的可执行文件安装到系统目录下&#xff0c;这样在不同的目录下都可以执行编译的可执行文件&#xff0c;相当于做成了个命令。这个就需要用到make install。 源文件如下&#xff1a;用于判断系统是小端还是大端…

Leetcode86_分隔链表

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的…

提升法律文书起草效率:AlphaGPT 助力律师快速生成诉讼和仲裁文件

法律文书起草对于法律专业人士而言是一项基础而关键的任务。无论是民事、刑事还是行政诉讼&#xff0c;以及仲裁案件&#xff0c;精确的法律文书撰写对于案件的成功至关重要。然而&#xff0c;这一过程往往既耗时又复杂&#xff0c;尤其是在处理复杂的案情和面对当事人难以理解…

ssm057学生公寓管理中心系统的设计与实现+jsp

学生公寓管理中心系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生公寓管理中心系统就是在这样的大环境下诞生&#xff0c;其可以帮助管…

MyBaties-plus 小蓝鸟 构造器 QueryWrapper 知识学习汇总

一、QueryWrapper是什么&#xff1f; QueryWrapper 是 mybatis-plus 条件构造器 https://mp.baomidou.com 小蓝鸟官方网址 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做…

Jmeter03:直连数据库

1 Jmete组件&#xff1a;直连数据库 1.1 是什么&#xff1f; 让Jmeter直接和数据库交互 1.2 为什么&#xff1f; 之前是通过接口操作数据库&#xff0c;可能出现的问题&#xff1a;比如查询可能有漏查误查的情况&#xff0c;解决方案是人工对不&#xff0c;效率低且有安全隐患…

【Python基础】异常

文章目录 [toc]什么是异常异常处理try...except...语句格式示例不使用异常处理时使用异常处理时 抛出异常示例 else语句格式示例 finally语句格式示例finally语句的作用 自定义异常类示例 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Py…

论文复现---MUTANT

Robust anomaly detection for multivariate time series through temporal GCNs and attention-based VAE 基于时序神经网络和基于注意力的VAE的多变量时间序列鲁棒异常检测 https://github.com/Coac-syf/MUTANT * numpy1.21.2* torch1.9.1* scipy1.7.1* scikit-learn0.24.2*…

海信发布《黑神话:悟空》定制电视E8N新品,重塑大屏游戏体验

4月17日&#xff0c;在“AI美好生活”2024海信电视E8系列新品发布会上&#xff0c;海信电视官宣成为《黑神话&#xff1a;悟空》全球官方合作伙伴。同时&#xff0c;海信电视还为广大游戏玩家带来了《黑神话&#xff1a;悟空》的显示CP&#xff0c;推出了官方定制电视——旗舰新…

ModuleNotFoundError: No module named ‘scripts.animatediff_mm‘ 解决方案

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文主要介绍在使用 Stable Diffusion WebUI 安装 AnimateDiff 插件后出现的ModuleNotFoundError: No module named scripts.animatediff_mm异常的解决方案,希望…

Linux小知识:xargs命令的使用与技巧

在Linux系统中&#xff0c;命令行工具是用户与系统进行交互的重要桥梁。其中&#xff0c;xargs命令是一个非常实用的工具&#xff0c;它能够将标准输入的数据转换为命令行参数&#xff0c;从而方便用户对数据进行批量处理。今天&#xff0c;我们就来详细了解一下xargs命令的使用…