【力扣】19. 删除链表的倒数第 N 个结点

news2024/9/24 7:20:01

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

相比于昨天,感觉刷题越来越轻松了~ 我进步了!

以后刷题力度要加快了,因为我报了蓝桥杯!加油~

法一:计算链表长度

思路:

首先用个函数来计算出该链表的长度,然后因为这里题目给的n是从后开始往前数的,所以我们需要计算出待删除结点的前一个结点的下标长度,然后这里我们引用了一个哑结点,主要是记录头部结点的位置。删除的原理就是让前一个结点->next指向其下一个结点,实现删除的目的。

cur->next=cur->next->next;也就是这样

代码:

/**
 * 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:
    //1.链表长度
    int getLength(ListNode* head){
        int length=0;
        while(head){
            ++length;
            head=head->next;
        }
        return length;
    }
    //2.移除操作
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //创建一个结点为0且next指向head的指针
        ListNode* dumy=new ListNode(0,head);
        int length=getLength(head);
        ListNode* cur=dumy;
        for(int i=1;i<length-n+1;i++){
            cur=cur->next;
        }
        cur->next=cur->next->next;
        ListNode* ans=dumy->next;
        //释放空间,不要也行,不影响
        delete dumy;
        return ans;
        }
};

 法二:栈

用栈的目的也是为了找出当前结点的前驱结点。然后就和上题一样了。

思路:

  • 首先遍历链表让其进栈,然后push出栈n个,此时栈顶的元素既是n元素的前一个,然后进行操作即可。需要注意的是博主我在这里踩了个雷,那就是有头结点和没有设置头结点时报的错
  • 然后在有头结点的情况下,是不需要考虑栈为空的情况的。比如说,当head=[1],n=1时,此时头结点为0,在栈中还没弹出的情况下stk=[0,1]的,弹出之后就是stk=[0],此时stack.top()是不为空的,也就是不会报空指针异常的操作的,但是如果不需要头结点的话,那就请判断一下
  • 最后我的代码是无结点的情况。

代码:

/**
 * 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) {
       stack<ListNode*> stk;
       ListNode* cur=head;
       while(cur){
           stk.push(cur);
           cur=cur->next;
       }
       for(int i=1;i<=n;i++){
           stk.pop();
       }
        ListNode* pre;
       //若栈不为空
       if(!stk.empty()){
            pre=stk.top();
       }else{
           head=head->next;
           return head;
       }
       //用这种方法是没有考虑到头结点为空的情况的。细想一下,所以哑结点的作用就突出来了
       pre->next=pre->next->next;
       return head;
    }
};

法三:快慢指针

题解:

这个的原理就是有两个人,比如说张三和李四。他俩在一条道上走(起点相同),但是张三会比李四先走n步,二者行走速度始终相同,直到张三走到终点,那最后张三和李四的距离是不是n?那我现在在这条道的倒数n的距离设置一个炸弹,但是张三买了装备,所以炸不死他。但是李四可以,那结合刚刚说的,是不是张三的终点就是李四的死亡💣?想一下,二者的距离是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:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //1.设置哑结点
        ListNode*dumy=new ListNode(0,head);
        //2.控制两指针的距离
        ListNode* first=head;
        ListNode* second=dumy;
        //让first指针也就是张三先走n步
        for(int i=1;i<=n;i++){
            first=first->next;
        }
        //同时张三和李四以相同的速度行走直到张三到达终点
        while(first){
            first=first->next;
            second=second->next;
        }
        //让李四跳起来,远离炸弹
        second->next=second->next->next;
        return dumy->next;
    }
};

总结:

大家有没有发现其实法一和法二其实差不多,用栈的时候遍历一下就相当于长度的计算,快慢指针也很有意思,我觉得嗷~

总有些坑是要自己踩了才会影响深刻的,也会更加强大,所以,多多踩坑吧,宝子们~

祝你生活愉快~

刷题幸福哦~

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

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

相关文章

接口返回HTML页面详解

import requests from bs4 import BeautifulSoup import re import jsonurl https://listado.mercadolibre.com.mx/hogar-muebles-jardin/cocina/almacenamiento-organizacion/organizadores-cocina/_CustId_570995983_PrCategId_AD# 添加 headers 和 cookies headers {User-…

批量解压imagenet1k数据集中的zip文件

导言&#xff1a; 最近在处理imagenet1k数据集时&#xff0c;面对大量的zip包&#xff0c;手动一个一个解压显然不是明智的选择。作为程序员&#xff0c;我们可以采用批量解压的方法来提高效率&#xff0c;下面就是解决这一问题的方法和原因分析。 问题背景&#xff1a; image…

拆解大语言模型 RLHF 中的PPO算法

为什么大多数介绍大语言模型 RLHF 的文章&#xff0c;一讲到 PPO 算法的细节就戛然而止了呢&#xff1f;要么直接略过&#xff0c;要么就只扔出一个 PPO 的链接。然而 LLM x PPO 跟传统的 PPO 还是有些不同的呀。 其实在 ChatGPT 推出后的相当一段时间内&#xff0c;我一直在等…

11月,1Panel开源面板项目收到了这些评论

2023年11月24日&#xff0c;1Panel开源面板项目&#xff08;https://github.com/1Panel-dev&#xff09;发布了题为《10月&#xff0c;1Panel开源面板收到了这些评论》的社区评论合集。在该文章的评论区&#xff0c;很多社区用户跟帖发表了自己对1Panel开源项目的使用感受和意见…

【思考】只有实对称矩阵才能正交对角化吗?【矩阵的合同】

1&#xff1a;命题改写&#xff08;A可以正交对角化&#xff09; 2&#xff1a;左乘Q右乘Q逆&#xff08;Q转置&#xff09; 3&#xff1a;取转置 4&#xff1a;得证 总结 可以看到&#xff0c;矩阵如果可以正交对角化&#xff0c;那么一定是实对称矩阵。 另外&#xff0c;这…

stm32项目(12)——基于stm32f407zgt6的频率计设计

1.项目功能 配置stm32自带的定时器&#xff0c;以一定的周期产生中断&#xff0c;在中断服务函数里面&#xff0c;对某个IO口进行取反&#xff0c;这样就在该管脚上产生了一定频率的方波&#xff08;频率可以用按键调节&#xff09;。然后再使用stm32的捕获功能&#xff0c;对产…

Python语言学习笔记之十一(DotEnv)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、认识Python DotEnv dotenv是Python中的一个工具包&#xff0c;它主要用于谈取项目中的.env文件&#xff0…

科研论文中PPT图片格式选择与转换:EPS、SVG 和 PDF 的比较

当涉及论文中的图片格式时&#xff0c;导师可能要求使用 EPS 格式的图片。EPS&#xff08;Encapsulated PostScript&#xff09;是一种矢量图格式&#xff0c;它以 PostScript 语言描述图像&#xff0c;能够无损地缩放并保持图像清晰度。与像素图像格式&#xff08;如 PNG 和 J…

VR智慧眼:为各行业打造3D数字化业务协同平台

自改革开放以来&#xff0c;城镇化建设一直在不断推进实施&#xff0c;如今各城市化速度虽然在不断加快&#xff0c;但随之而来的部分城市开始出现资源短缺、环境污染、交通拥堵、安全隐患等问题&#xff0c;因此为了满足智慧城市大型区域场景数字化升级需求&#xff0c;助力区…

SQL Server数据库使用T-SQL语句简单填充

文章目录 操作步骤&#xff1a;1.新建数据库起名RGB2.新建表起名rgb3.添加三个列名4.点击新建查询5.填入以下T-SQL语句&#xff0c;点击执行&#xff08;F5&#xff09;6.刷新之后&#xff0c;查看数据 操作环境&#xff1a; win10 Microsoft SQL Server Management Studio 20…

【项目管理】CMMI对项目管理有哪些个人启发和思考

导读&#xff1a;本人作为项目经理参与公司CMMI5级评审相关材料准备工作&#xff0c;现梳理CMMI有关知识点&#xff0c;并结合项目给出部分示例参考&#xff0c;以及本人对于在整理材料过程中一些启发和体验思考。 目录 1、CMMI定义 2、CMMI-5级 3、CMMI文档清单 4、示例-度…

【Spring Boot】Starter机制的使用及案例

一、引言 1、什么是SpringBoot Starter SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就能自动扫描到要加载的信息并启…

7+m6A+分型+实验,甲基化方向的生信思路,没有思路的同学可参考

今天给同学们分享一篇生信文章“Landscape analysis of m6A modification regulators related biological functions and immune characteristics in myasthenia gravis”&#xff0c;这篇文章发表在J Transl Med期刊上&#xff0c;影响因子为7.4。 结果解读&#xff1a; MG相…

Notes Domino 14.0正式版发布

大家好&#xff0c;才是真的好。 经过12个月的等待&#xff0c;经过三个Beta版本的迭代&#xff0c;昨天晚上11:00&#xff0c;Notes Domino 14.0版本正式发布&#xff01; 过去半年&#xff0c;经过我们对三个Beta版本不断的测试和介绍&#xff0c;一些新功能可能大家已经了…

基于Java的在线教育平台设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对学生课程学习信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

人工智能如何改变未来的教育

人工智能&#xff08;AI&#xff09;正在以惊人的速度发展&#xff0c;并有可能彻底改变我们生活的方方面面&#xff0c;包括教育。AI 可以用于提高教学效率、个性化学习体验和扩大教育机会。 在教学效率方面&#xff0c;AI 可以用于自动化许多繁琐的教学任务&#xff0c;例如…

机器学习---音乐分类案例

1、傅里叶变换 时域分析&#xff1a;对一个信号来说&#xff0c;信号强度随时间的变化的规律就是时域特性&#xff0c;例如一个信号的时域波形可以表达信号随着时间的变化。 频域分析&#xff1a;对一个信号来说&#xff0c;在对其进行分析时&#xff0c;分析信号和频率有关的…

ubuntu下搜索文件的几种方法

一、whereis命令&#xff1a; whereis命令只能用于程序名的搜索&#xff0c;而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数&#xff0c;则返回所有信息。 whereis的命令格式&#xff1a; whereis [-bmsu] [BMS 目录名 -f ] 文…

C语言—每日选择题—Day47

第一题 1. 以下逗号表达式的值为&#xff08;&#xff09; (x 4 * 5, x * 5), x 25 A&#xff1a;25 B&#xff1a;20 C&#xff1a;100 D&#xff1a;45 答案及解析 D 本题考查的就是逗号表达式&#xff0c;逗号表达式是依次计算每个表达式&#xff0c;但是只输出最后一个表…

做为一个产品经理带你详细了解--动态面板的使用

&#x1f4da;&#x1f4da; &#x1f3c5;我是bing人&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…