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

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

总结:

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

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

祝你生活愉快~

刷题幸福哦~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PWN】学习笔记(三)【返回导向编程】(下)

目录 课程回顾ret2libc![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ebe1a9a9e54f4319946621dbe89c5774.png)做题 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; h…

Linux:时间显示(函数介绍)

文章目录 1、sleep&#xff1a;延迟函数2、time/localtime3、示例&#xff1a;sleep time localtime4、Linux时间调整 1、sleep&#xff1a;延迟函数 函数原型&#xff1a;unsigned int sleep(unsigned int seconds); 功 能&#xff1a;延时 参 数&#xff1a;seconds:秒&am…

【Python必做100题】之第十八题(找质数因子)

题目&#xff1a;输入一个正整数&#xff0c;输出它的所有质数因子&#xff08;如180的质数因子为2、2、3、3、5&#xff09; 代码如下&#xff1a; a int(input("请输入一个自然数&#xff1a;")) y 2 list [ ]while a ! y:if a % y 0:list.append(y)a / yelse…

华为认证 | HCIE-Security V3.0 认证将在12月底发布!

非常荣幸地通知您&#xff0c;华为认证HCIE-Security V3.0&#xff08;中文版&#xff09;预计将于2023年12月29日正式对外发布。 为了帮助您做好学习、培训和考试计划&#xff0c;现进行预发布通知&#xff0c;请您关注。 HCIE-Security V3.0考试代码&#xff1a; H12-731&…

力扣131. 分割回文串(java 回溯法)

Problem: 131. 分割回文串 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 题目要求我们给出所有的回文子字符串&#xff0c;而涉及到穷举我们可以利用回溯来解决&#xff0c;另外我们也可以发现问题中涉及到元素存在重复但不可复用的特性&#xff0c;因此我们可以类…

简单描述从输入网址到页面显示的过程

当用户输入网址并按下回车键后&#xff0c;浏览器会进行以下步骤&#xff1a; DNS 解析&#xff1a;浏览器会解析网址中的域名部分&#xff0c;提取出需要访问的目标域名。然后&#xff0c;它会向本地 DNS 服务器发送一个 DNS 查询请求&#xff0c;以获取该域名对应的 IP 地址。…

【计算机组成体系结构】双端口RAM和多体结构主存储器

一、存取周期回顾 DRAM的电容结构决定了DRAM的破坏性读出&#xff0c;因此DRAM需要在存取过程中不断的恢复刷新才能使数据不丢失。 由此引发了两个问题&#xff0c;多核CPU的每个核都要访存怎么办&#xff1f;以及如何解决恢复时间长的问题&#xff1f; 二、双端口RAM 双端口…

linux 网络子系统 摘要

当你输入一个网址并按下回车键的时候&#xff0c;首先&#xff0c;应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号&#xff0c;确认了双方通信的应用程序;然后网络协议加上了双方的IP地址&#xff0c;确认了双方的网络位置;最后链路层协议加上了双方的M…

CLE Diffusion:Controllable light enhancement diffusion model

自己训练了个控制亮度变化的扩散模型。 1.Introduction low-light capturing conditions有很多因素&#xff0c;比如sub-optimal ISO setting&#xff0c;纠正degradation是关键。直方图均衡化来调整对比度&#xff0c;旨在扩展低光图像的动态范围。提出了可迭代的Controllabl…

Unity:Camera讲解之ClearFlags

Clear Flags四个选项讲解: 前三个都是常用的&#xff0c;第四个基本不会用。 skybox(天空盒&#xff09;&#xff1a; 主要是一种用于渲染游戏场景中天空的技术。它是一个包含6个纹理图片的立方体贴图&#xff0c;分别代表了从不同角度观察天空时所看到的前、后、上、下、左…

【机器学习】利用线性回归预测披萨价格

目录 前言 一、绘制散点图 二、数据准备 三、一元线性回归模型训练 四、一元线性回归模型评估 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首…

Github 2023-12-15 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-15统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目3非开发语言项目3JavaScript项目1Python项目1Rust项目1PHP项目1 基于项目的学习 创建周期&am…

Python-折线图可视化

折线图可视化 1.JSON数据格式2.pyecharts模块介绍3.pyecharts快速入门4.创建折线图 1.JSON数据格式 1.1什么是JSON JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据JSON本质上是一个带有特定格式的字符串 1.2主要功能json就是一种在各个编程语言中流…

Splashtop 与 Swif 携手通过集成的远程桌面访问简化设备管理

2023年12月14日 加利福尼亚州库比蒂诺 安全远程访问解决方案领域的开拓者 Splashtop 今日宣布与 Swif——设备管理和安全领域先驱建立全新集成合作伙伴关系。此次合作推动形成了简单而强大的解决方案&#xff0c;该解决方案可满足中小企业和大型企业不断变化的需求&#xff0c…

开源基础底座:IT系统中角色管理的定义与应用

在IT系统中&#xff0c;角色管理是指管理和控制系统用户的角色和权限的过程。角色是指用户在系统中扮演的特定身份或角色&#xff0c;例如管理员、操作员、审计员等。每个角色都可以被分配一组特定的权限和访问权限&#xff0c;以决定其在系统中可以执行和访问的功能和数据。 …

【数组Array】力扣-304 二维区域和检索 - 矩阵不可变

目录 题目描述 解题过程 labuladong题解 题目描述 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&#xf…

C语言—每日选择题—Day42

第一题 1. 下面程序输出的结果是&#xff08;&#xff09; #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A&#xff1a;2 B&#xff1a;随机值 C&#xff1a;都不是 D&#xff1a;15 答案及解析 D p…

指针相关知识(入门)

通过前面的学习&#xff0c;我们已经对c语言有了一个初步的认识 接下来&#xff0c;我们继续学习。进入下一个阶段&#xff0c;指针。这个部分的知识较多&#xff0c;可能学习起来有些吃力&#xff0c;但是&#xff0c;从简到难&#xff0c;我们慢慢学习。 一.指针的概念 导入…

3.electron之vue3.0的桌面应用程序

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中&#xff0c;因此它允许你仅需一个代码仓库&#xff0c;就可以撰写支持 Windows、…

代码随想录27期|Python|Day15|二叉树|层序遍历|对称二叉树|翻转二叉树

本文图片来源&#xff1a;代码随想录 层序遍历&#xff08;图论中的广度优先遍历&#xff09; 这一部分有10道题&#xff0c;全部可以套用相同的层序遍历方法&#xff0c;但是需要在每一层进行处理或者修改。 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 层…