LeetCode 算法:删除链表的倒数第 N 个结点 c++

原题链接🔗:删除链表的倒数第 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

进阶:你能尝试使用一趟扫描实现吗?

题解

双指针法

  1. 题解

LeetCode 上的 “删除链表的倒数第 N 个结点” 问题是链表操作中的一个经典问题。这个问题可以通过双指针技术来解决。以下是解题思路:

  • 理解问题:题目要求删除链表中倒数第 N 个节点。例如,如果链表是 1->2->3->4->5,N=2,那么删除后应该是
    1->2->3->5。

  • 使用虚拟头节点:创建一个虚拟头节点,指向原链表的头节点。这样无论原链表的头节点是否被删除,都能保证算法的通用性。

  • 快慢指针:初始化两个指针 fast 和 slow,都指向虚拟头节点。然后移动 fast 指针,使其向前移动 N 步。

  • 同时移动两个指针:接着同时移动 fast 和 slow 指针,直到 fast 指针到达链表的末尾。此时,slow 指针将指向倒数第 N
    个节点的前一个节点。

  • 删除节点:删除 slow 指针的下一个节点,即将 slow->next 指向 slow->next->next。

  • 特殊情况处理:如果 N 大于链表长度,或者链表为空,则无需删除任何节点。

  • 返回结果:返回虚拟头节点的下一个节点,即原链表的新头节点。

  1. 复杂度:时间复杂度O(L),其中L是链表的长度,空间复杂度O(1)。
  2. 代码过程:如demo所示。
  • 首先定义了 ListNode 结构体;
  • 然后实现了 removeNthFromEnd 函数,该函数接收链表的头节点和要删除的节点的索引n。函数内部使用了一个虚拟头节点来简化代码逻辑,并使用双指针技术来找到并删除倒数第 n 个节点。
  • 最后,main 函数中创建了一个示例链表,调用了 removeNthFromEnd函数,并打印了修改后的链表。
  • 最后,不要忘记释放链表占用的内存以避免内存泄漏。
  1. c++ demo
#include <iostream>// 定义链表节点结构体
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};// 删除链表的倒数第N个节点
ListNode* removeNthFromEnd(ListNode* head, int n) {// 创建虚拟头节点,简化边缘情况处理ListNode* dummy = new ListNode(0);dummy->next = head;// 初始化两个指针,p1 和 p2,都指向虚拟头节点ListNode* p1 = dummy, * p2 = dummy;// 使 p1 先走 n 步for (int i = 0; i < n; ++i) {p1 = p1->next;}// 当 p1 到达第 n 个节点时,p2 开始移动// 当 p1 到达链表末尾时,p2 到达倒数第 n 个节点的前一个节点while (p1 != nullptr) {p1 = p1->next;p2 = p2->next;}// 删除倒数第 n 个节点ListNode* toDelete = p2->next;p2->next = p2->next->next;// 释放被删除节点的内存delete toDelete;// 返回调整后的链表头节点,注意跳过虚拟头节点ListNode* newHead = dummy->next;delete dummy; // 释放虚拟头节点return newHead;
}// 打印链表的辅助函数
void printList(ListNode* node) {while (node != nullptr) {std::cout << node->val << " -> ";node = node->next;}std::cout << "null" << std::endl;
}// 测试用例
int main() {// 创建一个示例链表: 1 -> 2 -> 3 -> 4 -> 5ListNode* list = new ListNode(1);list->next = new ListNode(2);list->next->next = new ListNode(3);list->next->next->next = new ListNode(4);list->next->next->next->next = new ListNode(5);std::cout << "Original List: ";printList(list);// 删除倒数第 2 个节点ListNode* newList = removeNthFromEnd(list, 2);std::cout << "Modified List: ";printList(newList);// 释放链表内存while (newList != nullptr) {ListNode* temp = newList;newList = newList->next;delete temp;}return 0;
}
  • 输出结果:

Original List: 1 -> 2 -> 3 -> 4 -> 5 -> null
Modified List: 1 -> 2 -> 3 -> 4 -> null
在这里插入图片描述

其他方法

  • 计算链表长度法。
  • 栈法。

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

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

相关文章

【无线传感网】LEACH路由算法

1、LEACH路由算法简介 LEACH协议,全称是“低功耗自适应集簇分层型协议” (Low Energy Adaptive Clustering Hierarchy),是一种无线传感器网络路由协议。基于LEACH协议的算法,称为LEACH算法。 2、LEACH路由算法的基本思想 LEACH路由协议与以往的路由协议的不同之处在于其改变…

ElasticSearch地理空间数据写入

目录 ElasticSearch地理空间数据写入思路介绍实现(geo_point)数据处理创建点的mappings使用Java将数据写入ES配置maven依赖项目配置ES数据写入查询数据实现(geo_shape)数据处理创建geo_shape的mappings使用Java将数据写入ES数据写入查询数据ElasticSearch地理空间数据写入 申明…

欧拉函数的求解

欧拉函数的定义 欧拉函数的性质 性质1是性质2的特殊情况 性质1的理解&#xff1a;一个数a是质数&#xff0c;前面的数b与a的gcd一定是1 性质2的理解&#xff1a;1,2,…p,p1,p2…2p,…3p…p^k 其中以np结尾的序列重复了p^&#xff08;k-1&#xff09;次&#xff0c;每一次的循环…

HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

【设计模式深度剖析】【11】【行为型】【解释器模式】| 以算术表达式求值为例加深理解

&#x1f448;️上一篇:状态模式 设计模式-专栏&#x1f448;️ 文章目录 解释器模式定义英文原话直译 解释器模式中的角色1. 抽象表达式&#xff08;AbstractExpression&#xff09;2. 终端表达式&#xff08;TerminalExpression&#xff09;3. 非终端表达式&#xff08;Non…

6.S081的Lab学习——Lab7: Multithreading

文章目录 前言一、Uthread: switching between threads (moderate)提示&#xff1a;解析 二、Using threads (moderate)解析&#xff1a; 三、Barrier (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的…

[Linux] 文件系统

UNIX操作系统将文件组织成一个有层次的树形结构&#xff1a; 标准目录&#xff1a; 根目录&#xff1a; /tmp目录 主目录&#xff1a; 这就是主目录 一般与系统有关的信息都存放在etc目录下 注意&#xff1a; /etc/passwd存放的是用户账户信息&#xff0c;不是密码信息&#xf…

VMware RedHat虚拟机磁盘扩容(添加磁盘和扩展磁盘)

前言 自己的电脑上配一个虚拟机还是很有必要的&#xff0c;用起来比双系统方便一点&#xff0c;之前搞了100g的ubuntu没用到&#xff0c;后面重装redhat觉得随便搞个20g就够用了&#xff0c;后面用到之后就遇到磁盘不够用的情况&#xff0c;只能说情况允许的话&#xff0c;磁盘…

FPGA生成图像Modelsim仿真生成BMP图片保存显示

FPGA生成图像模板&#xff0c;产生RBG格式棋盘格。利用Modelsim仿真&#xff0c;将FPGA生成的图片转化成BMP图片保存并显示。 一&#xff1a;仿真代码 timescale 1ns/1ps module design_1_wrapper_top (); reg clk_100MHz; reg clk_300MHz; wire [31:0]clk_rate; …

为微信小程序项目添加eslint

背景 在使用vscode开发微信小程序的过程中&#xff0c;修改js的时候发现没有报错提示&#xff0c;让我很不习惯&#xff0c;所以想为微信小程序项目添加eslint配置 编码实战 为微信小程序配置ESLint可以遵循以下步骤&#xff1a; 安装ESLint及其相关插件 首先&#xff0c;…

基于IDEA的Maven(坐标信息介绍和编写)

这篇博客来学习和分析一下&#xff1a; " pom.xml " 所生成的最基本的信息。 之前的博客中讲到&#xff0c;学 Maven 就是学 " pom.xml " 的配置。后面也会围绕这个文件进行学习。 目录 一、分析 pom.xml 文件 &#xff08;1&#xff09;分析的 "p…

2024 年最新 Python 基于火山引擎豆包大模型搭建 QQ 机器人详细教程(更新中)

豆包大模型概述 火山引擎官网&#xff1a;https://www.volcengine.com/ 字节跳动推出的自研大模型。通过字节跳动内部50业务场景实践验证&#xff0c;每日千亿级tokens大使用量持续打磨&#xff0c;提供多模态能力&#xff0c;以优质模型效果为企业打造丰富的业务体验。 模型…

数据库 | SQL语言和关系代数汇总篇(*^▽^*)

双重/两个 not exists 嵌套查询 简单分析_两个not exists-CSDN博客 最明白的 not exists 双层嵌套讲解 SQL 查询语句_not exist 嵌套-CSDN博客 1. 答案&#xff1a; 2. 答案&#xff1a; 3. 4. 5. 6. 7. 8. 这个SQL查询是从两个表&#xff08;假设是SPJ和P&#xff09;中检…

智能合约新项目 链上智能合约前端H5源码 智能合约区块链 以太坊前端调用智能合约

智能合约新项目 链上智能合约前端H5源码 智能合约区块链 以太坊前端调用智能合约 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89402192 更多资源下载&#xff1a;关注我。

.NET+Python量化【1】——环境部署和个人资金账户信息查询

前言&#xff1a;量化资料很少&#xff0c;.NET更少。那我就来开个先河吧~ 以下是使用QMT进行量化开发的环境部署和基础信息获取有关操作。 1、首先自己申请券商的QMT权限&#xff0c;此步骤省略。 2、登陆QMT&#xff0c;选择极简模式&#xff0c;或者独立交易模式之类的。会进…

阿里员工:“大厂病”导致有些人不太正常

阿里巴巴对“大公司病”开刀 阿里巴巴宣布对“大公司病”开刀&#xff0c;终于有高层意识到这个问题的严重性&#xff0c;并决心解决。所谓“大公司病”&#xff0c;不仅体现在规模臃肿、部门繁多、层次复杂&#xff0c;还包括中层管理人员的不作为。这些人处在上传下达的位置&…

旅游管理平台系统

摘要 如今许多地区的风景已经随着网络技术的不断发展和进步而映入人们的眼帘&#xff0c;旅游已经成为一种大众化的休闲方式。而青海海西州风光旖旎&#xff0c;民族文化独特&#xff0c;更是吸引了众多游客纷至沓来。海西州地域广阔、人烟稀少、是一个经济发展缓慢的地方&…

nginx+tomcat负载均衡、动静分离群集【☆☆☆☆☆】

Nginx是一款非常优秀的HTTP服务器软件&#xff0c;性能比tomcat更优秀&#xff0c;它支持高达50 000个并发连接数&#xff0c;拥有强大的静态资源处理能力&#xff0c;运行稳定&#xff0c;内存、CPU等系统资源消耗非常低。目前很多大型网站都应用Nginx服务器作为后端网站程序的…

Python Textract库:文本提取

更多Python学习内容&#xff1a;ipengtao.com Textract是一个强大的Python库&#xff0c;用于从各种文件格式中提取文本。无论是PDF、Word文档、Excel电子表格、HTML页面还是图像&#xff0c;Textract都能有效地提取其中的文本内容。Textract通过集成多种开源工具和库&#xff…

opencascade AIS_InteractiveContext源码学习1 object display management 对象显示管理

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…