力扣HOT10(29) 删除链表的倒数第 N 个结点

一、先搞懂链表删除操作的核心本质

⚠️ 所有链表删除题的第一原则:要删除一个节点,必须先找到它的前驱节点!

比如要删除节点 4,你不能直接操作 4,必须先找到它的前一个节点 3,然后执行:

3->next = 3->next->next;

这样就把 4 从链表中删掉了。

这就是为什么这道题我们的目标不是找到倒数第 N 个节点,而是找到倒数第 N 个节点的前驱节点

二、为什么必须用虚拟头节点?

如果要删除的节点是头节点 (比如示例 2:[1],删除倒数第 1 个),头节点没有前驱节点,需要单独写代码处理,非常容易出错。

用虚拟头节点的好处:

  • 给头节点也造一个前驱,所有节点的删除逻辑完全统一,不用再单独处理头节点的情况。

三、方法一:计算链表长度

核心思路

  1. 先遍历一遍链表,计算出链表的总长度L
  2. 倒数第 N 个节点,就是正数第L - N + 1个节点;
  3. 我们需要找到它的前驱,也就是正数第L - N个节点;
  4. 执行删除操作。

方法二:栈

核心思路

  1. 把所有节点(包括虚拟头)依次入栈;
  2. 弹出 n 个节点,此时栈顶的节点就是倒数第 N 个节点的前驱;
  3. 执行删除操作。

方法三:双指针法(面试首选!进阶要求,O (L) 时间,O (1) 空间)

1.核心思想(一句话记死)

让快指针先走 n 步,然后快慢指针一起走,当快指针走到链表末尾时,慢指针正好指向倒数第 n 个节点的前驱。

2. 为什么这样是对的?

  • 快指针先走 n 步,此时快慢指针之间的距离正好是 n;
  • 然后两个指针以相同速度一起走,距离保持不变;
  • 当快指针走到nullptr时,慢指针和末尾的距离正好是 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) {



        
        //双指针法
        //两个指针

        //虚拟头
        ListNode *dhead = new ListNode(-1);
        dhead->next = head;

        ListNode *p1 = dhead;
        ListNode *p2 = head;


        //p2先走n步
        int step = 0;//记录走了多少步
        while(step<n){
            p2 = p2->next;
            step++;
        }

        //p1 p2同时走 直到p2走到头 p1的位置就是要删除的节点的前驱节点
        while(p2!=nullptr){

            p1 = p1->next;
            p2 = p2->next;

        }
        
        p1->next = p1->next->next;
       // while(p1!=nullptr){

       //     p1 = p1->next;
       // }

        return dhead->next;
    }
};
相关推荐
通信仿真爱好者11 分钟前
第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
算法·matlab·mimo·信号检测
AI科技星27 分钟前
全域谱分析:无穷维超复数信息场分形统一场论——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·python·算法·金融·乖乖数学·全域数学
先吃饱再说1 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
留白_2 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hqzing2 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
AI科技星2 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
AI科技星3 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
Tim_103 小时前
【C++】013、空类占多少字节?
算法
Ricky_Theseus3 小时前
并查集:连通性问题
算法
Tairitsu_H3 小时前
[LC优选算法#18] 前缀和 | 除⾃⾝以外数组的乘积 | 和为K的⼦数组 | 和可被K整除的⼦数组
算法·前缀和·哈希算法