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

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

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

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

法一:计算链表长度

思路:

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

c**ur->next=cur->next->next;**也就是这样

代码:

cpp 复制代码
/**
 * 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()是不为空的,也就是不会报空指针异常的操作的,但是如果不需要头结点的话,那就请判断一下
  • 最后我的代码是无结点的情况。

代码:

cpp 复制代码
/**
 * 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,此时张三已经到了。那在这道题中,我想要得到的是当张三到达终点时,李四走到的隔炸弹一个单位的距离,然后跳一步直接跳过炸弹。怎么操作呢?只要在最开始的时候设置一个哑节点,张三指向头结点,李四指向哑节点,同时哑结点距离头结点只有一个单位的距离就可以了吖~对吧?

代码:

cpp 复制代码
/**
 * 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;
    }
};

总结:

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

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

祝你生活愉快~

刷题幸福哦~

相关推荐
祖力5514 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省15 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79817 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25817 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记17 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI17 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型18 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光18 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院19 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡20 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构