每日一题--删除链表的倒数第 N 个结点

破阵子-晏殊

燕子欲归时节,高楼昨夜西风。

求得人间成小会,试把金尊傍菊丛。歌长粉面红。
斜日更穿帘幕,微凉渐入梧桐。

多少襟情言不尽,写向蛮笺曲调中。此情千万重。

目录

题目描述:

思路分析:

方法及时间复杂度:

法一 双指针(经典解法)

法二 计算链表长度(暴力解法)

法三 栈

法四 哈希表

法五 vector

个人总结:


 

 题目描述:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

思路分析:

此题要求是删除倒数第N个结点,那么主要的就是找到倒数第N个结点,然后让该节点的前一个指向该结点的下一个。

 那么这道题便有五种以上的解法,核心就是找到要删的那个结点。

方法及时间复杂度:

法一 双指针(经典解法)

定义两指针:fast=head,slow=head。

fast先走n步,然后fast跟slow同时走。

直到fast走到空,此时slow 就到删除的结点。原理:设链表长L,快指针共走L步,慢指针走L-n步。故此方法由法二得来。

 由于这题是删除该结点,这得需要删除结点的前继结点。所以让slow少走一步。可以直接开辟一个虚拟结点让slow=dummy。

 这样solw就可以到达删除结点的前一个结点了。然后像思路分析那样操作。代码如下:

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummy=new ListNode(0,head);ListNode* fast=head,*slow=dummy;while(n--){fast=fast->next;}while(fast){fast=fast->next;slow=slow->next;}slow->next=slow->next->next;ListNode* ans=dummy->next;delete dummy;return ans;}
};

时间复杂度O(L),链表长度为L。

空间复杂度O(1)。

法二 计算链表长度(暴力解法)

遍历链表计算长度,减去n就是正着数的个数,注意的是,如果长度L-n==0就是头删了。代码如下:

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {int count=0;ListNode* cur=head,*pre=head;while(cur){++count;cur=cur->next;}if(count==n) return head->next;cur=head;for(int i=0;i<(count-n)&&cur!=nullptr;++i){pre=cur;cur=cur->next;}pre->next=cur->next;return head;}
};

时间复杂度O(L),链表长度为L。

空间复杂度O(1)。

法三 栈

根据栈的特点先进后出,创建一个虚拟头节点(防止空栈),让所有结点入栈,然后出栈n个结点,此时栈顶元素就是要删除的结点的前一个。

代码如下:

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummy=new ListNode(0,head);stack<ListNode*> st;ListNode* cur=dummy;while(cur){st.emplace(cur);cur=cur->next;}for(int i=0;i<n;++i){st.pop();}ListNode* pre=st.top();pre->next=pre->next->next;ListNode* ans=dummy->next;delete dummy;return ans;}
};

时间复杂度O(L),链表长度为L。

空间复杂度O(L)。为栈开销

法四 哈希表

主要思想是一样的,查找到删除结点的前一个结点,如果前一个没有结点就头删。

代码如下:

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {unordered_map<int,ListNode*> hash;ListNode *cur=head;int i=0;while(cur){hash.insert({i++,cur});cur=cur->next;}int target=i-n;if(target==0) return head->next;//target上一个位置的指针指向下一个ListNode* left=hash[target-1];left->next=left->next->next;return head;}
};

时间复杂度O(L),链表长度为L,哈希表查找也为O(L)。

空间复杂度O(L)。哈希表的开销。

法五 vector

与法四思路相同,不多解释。

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {vector<ListNode*> ret;ListNode* cur=head;while(cur){ret.emplace_back(cur);cur=cur->next;}int target=ret.size()-n;if(target==0) return head->next;ListNode* left=ret[target-1];left->next=left->next->next;return head;}
};

时间复杂度O(L),链表长度为L。

空间复杂度O(L)。

个人总结:

大致思路就是找倒数第n个结点,删除结点实现起来其实并不复杂,可以还有更多的方法做这道题。

 

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

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

相关文章

RK3568驱动指南|第八篇 设备树插件-第72章 设备树插件语法和编译实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Vue组件基础

Vue组件基础是DOMDOMjs前端组成下的页面布局区域划分&#xff0c;每个组件展示时都要在页面上有一定的大小。每个设定好的页面区域都可以定义Vue的组件&#xff0c;组件中包含了HTML模板、样式、Vue组件对象的定义。Vue的组件是包含页面设计在内的&#xff0c;是一种为页面某个…

【Python百宝箱】Python轻松操控邮件:SMTP、POP3和IMAP的魅力

前言 在数字时代&#xff0c;电子邮件作为信息传递的主要手段&#xff0c;对个人和企业的日常工作至关重要。Python提供了多个强大的库&#xff0c;使得电子邮件的发送和接收变得轻松而灵活。本文将深入介绍Python中与电子邮件相关的主要库&#xff0c;为读者提供从基础到高级…

Diffusion Model: DDIM

本文相关内容只记录看论文过程中一些难点问题&#xff0c;内容间逻辑性不强&#xff0c;甚至有点混乱&#xff0c;因此只作为本人“备忘”&#xff0c;不建议其他人阅读。 DENOISING DIFFUSION IMPLICIT MODELS: https://arxiv.org/abs/2010.02502 前序知识 DDPM&#xff1a;…

零基础学python第一天||数和四则运算

数和四则运算 一提到计算机&#xff0c;当然现在更多人把她叫做电脑&#xff0c;这两个词都是指computer。不管什么&#xff0c;只要提到她&#xff0c;普遍都会想到她能够比较快地做加减乘除&#xff0c;甚至乘方开方等。乃至于&#xff0c;有的人在口语中区分不开计算机和计…

kkflieview概念以及整合步骤

KKFlyView 是一款Android视图动画库&#xff0c;能够实现类似于飞行器驾驶舱的视觉效果。整合 KKFlyView 的步骤如下&#xff1a; 首先&#xff0c;将库添加到项目中。可以通过 Gradle 添加依赖项&#xff0c;也可以手动下载库并将其添加到项目中。 在布局文件中添加 KKFlyVie…

ElasticSearch之禁用交换分区

操作系统将进程加载至内存中执行时&#xff0c;对于当前未使用到的内存页&#xff0c;可能会将相关内存页交换至硬盘上&#xff0c;即swap。 对于性能敏感、时延敏感的应用程序比如ElasticSearch&#xff0c;swap特性会明显影响性能和稳定性&#xff0c;因此最好禁用swap特性。…

OSG粒子系统与阴影-雨效、雪效模拟(2)

雪效模拟示例 雪效模拟示例的代码如程序清单11-2所示&#xff1a; 1. /* 雪效模拟示例 */ 2. void snow_11_2(const string &strDataFolder) 3. { 4. osg::ref_ptr<osgViewer::Viewer> viewer new osgViewer::Viewer(); 5. osg::ref_ptr<osg::G…

做管理的那4件事

01、用人&#xff0c;不废人 什么是用人&#xff0c;不废人&#xff1f;核心就是两个点。 1.不对人坏 在工作中&#xff0c;有一些管理者因为格局不够&#xff0c;缺乏胸怀。 所以总是摆架子&#xff0c;而且喜欢用权压人&#xff0c;当有人不听他的话&#xff0c;就给人穿小…

一个tomcat中部署的多个war,相当于几个jvm

请直接去看原文 原文链接:一个tomcat有几个jvm-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 前几天向unmi提问&#xff0c;今天他答复了。我觉得答复很清楚&#xff0c;…

如何学习VBA:3.2.8 OnTime方法与OnKey方法

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

System-V共享内存和基于管道通信实现的进程池

文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独…

Jquery ajax 进行网络请求,同步阻塞引起的UI线程阻塞 (loading图片不显示 )

jax重新获取数据刷新页面功能&#xff0c;因为ajax属于耗时操作&#xff0c;想在获取数据且加载页面时显示加载遮罩层&#xff0c;结果发现了ajax的好多坑。 ajax 执行http网络请示时时&#xff0c;让遮罩层显示&#xff0c;ajax加载完毕后遮罩层消失。 因为我想让loadChart()…

LeetCode算法题解|474. 一和零

474. 一和零 题目链接&#xff1a;474. 一和零 题目描述 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子…

c++模板模板参数,可变数量的模板参数

当使用模板模板参数时&#xff0c;我们可以将一个模板作为另一个模板的参数&#xff0c;从而实现更大的灵活性和重用性。模板模板参数的主要优势之一是它允许我们编写适用于多种模板类型的通用代码。 下面是一些关于模板模板参数的更多信息 template <template <typenam…

外贸独立站外部优化:提升网站可见度与吸引力的策略

随着全球电子商务的快速发展&#xff0c;外贸独立站已经成为众多企业拓展海外市场、提升品牌影响力的关键工具。然而&#xff0c;要想在竞争激烈的外贸市场中脱颖而出&#xff0c;除了产品优质、服务周到外&#xff0c;还需要做好网站的外部优化工作。本文将详细探讨如何通过有…

卷积神经网络(CNN)识别验证码

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据4.标签数字化 二、构建一个tf.data.Dataset1.预处理函数2.加载数据3.配置数据 三、搭建网络模型四、编译五、训练六、模型评估七、保存和加载模型八、预测 …

Ubuntu18.04安装A-Loam保姆级教程

系统环境&#xff1a;Ubuntu18.04.6 LTS 1.A-Loam的安装前要求&#xff1a; 1.1 ROS安装&#xff1a;参考我的另一篇博客 Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客还是那句话&#xff0c;有时候加了这行也不好使&#xff0c;我是疯狂试了20次&#…

十六、互斥量

互斥量的目的就是为了实现互斥访问。 1、概述 (1)举例说明&#xff1a; 怎么独享厕所&#xff1f;自己开门上锁&#xff0c;完事了自己开锁。 你当然可以进去后&#xff0c;让别人帮你把门&#xff1a;但是&#xff0c;命运就掌握在别人手上了。 …

3.3.2 深度理解BITS_TO_LONGS函数

文章目录 定义物理意义内核应用应用一:直接使用应用二 间接使用测试驱动层示例应用层示例参考定义 BITS_TO_LONGS定义在include/linux/bitops.h中,具体如下 #define BITS_PER_BYTE 8 #define