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,一经查实,立即删除!

相关文章

(三)Kafka 安全之使用 SSL 的加密和身份验证

目录 一. 前言 二. 使用 SSL 的加密和身份验证 2.4. 生产中的常见缺陷&#xff08;Common Pitfalls in Production&#xff09; 2.4.1. 扩展密钥用法&#xff08;Extended Key Usage&#xff09; 2.4.2. 中间证书&#xff08;Intermediate Certificates&#xff09; 2.4.…

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

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

什么是:一点上云,多云互联

随着云计算技术的不断发展&#xff0c;企业对云服务的依赖越来越深。然而&#xff0c;面对多云环境、跨地域部署和复杂网络环境等挑战&#xff0c;如何实现高效、稳定、安全的云连接&#xff0c;成为众多企业关注的焦点。联通云联网以其丰富的全球资源、灵活统一的管理、强大的…

Qt|QWebSocket与Web进行通讯,实时接收语音流

实现功能主要思路&#xff1a;在网页端进行语音输入&#xff0c;PC机可以实时接收并播放语音流。 此时&#xff0c;Qt程序做客户端&#xff0c;Web端做服务器&#xff0c;使用QWebSocket进行通讯&#xff0c;实时播放接收的语音流。 功能实现 想要实现该功能&#xff0c;需要…

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…

vue播放flv格式的直播流

在ios无法播放&#xff0c;安卓可以 安装 npm install flv.js --save页面 <template><div><videoref"videoElement"style"width: 100%; height: 100%"autoplayplaysinlinemuted></video></div> </template><scr…

【设计模式深度剖析】【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;将它的…

OpenCV--波滤器(二)

高通滤波器 代码和笔记 代码和笔记 import cv2 import numpy as np""" 高通滤波器--锐化图像&#xff0c;增强图像中的高频成分&#xff0c; 如边缘(边缘检测&#xff1a;旨在找出图像中亮度变化显著的区域&#xff0c;大幅度地减少了数据量&#xff0c;并剔除…

[Linux] 文件系统

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

ubuntu换镜像源方法

查看ubuntu的版本&#xff0c;不同的版本对应的不同的镜像源 cat /etc/issue Ubuntu 18.04.6 LTS \n \l 先备份一个&#xff0c;防止更改错误 cobol cp /etc/apt/sources.list /etc/apt/sources.list.backup 先进入清华源,搜索ubuntu&#xff0c;点击问号 点进来可以看到可以…

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;…

spring和Mybatis的逆向工程

文章目录 十二、注解开发1、注解方式单表的增删改查的操作 十三、逆向工程13.1、创建逆向工程的步骤⑴添加依赖⑵配置MyBatis的核心配置文件⑶创建逆向工程的配置文件,该文件文件名必须是&#xff1a;generatorConfig.xml 13.2测试 十四、分页插件14.1、使用步骤14.2分页插件的…

基于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;以优质模型效果为企业打造丰富的业务体验。 模型…

代码随想录算法训练营刷题复习6 :贪心算法2/2

贪心算法 贪心算法这些题中&#xff0c;关于区间的问题可以进行小总结&#xff0c;今天有事耽搁了还没来得及写 860. 柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆气球 435. 无重叠区间 按照区间的左界对区间进行升序排序&#xff08;如遇到相同的值&#xf…