【Hot 100 刷题计划】 LeetCode 19. 删除链表的倒数第 N 个结点 | C++ 双指针单趟遍历
发布时间:2026/10/3 3:37:34来源:尧图企业网站定制
LeetCode 19. 删除链表的倒数第 N 个结点 题目描述题目级别中等给你一个链表删除链表的倒数第n个结点并且返回链表的头结点。示例 1:输入head [1,2,3,4,5], n 2输出[1,2,3,5] 破题思路前后双指针 (拉开固定间距)要想删除倒数第n个节点关键在于如何精准定位到它的前驱节点。如果不允许先遍历一遍获取链表总长度我们可以使用非常经典的**双指针滑动窗口**技巧引入 Dummy 节点删除节点时最怕的就是删除的是头节点。引入一个虚拟头节点dummy让原链表的所有节点都变成“普通节点”消除边界痛点。错开身位准备两个指针pre和post。让post先走。唤醒机制 (单循环魔法)我们用目标值n作为倒计时。每次循环post往前走n减 1。当n 0时说明post已经领先了n个身位此时唤醒pre开始跟着一起走。一击必杀这样一来pre和post之间就形成了一把长度恒定的“尺子”。当前面的post走到链表尽头时后面的pre必然刚好停在倒数第n个节点的前面直接修改pre-next即可完成击杀。 C 代码实现 (原汁原味作者版 内存优化)classSolution{public:ListNode*removeNthFromEnd(ListNode*head,intn){// 极客细节在栈上分配 dummy 节点避免 new 导致的内存泄漏ListNodedummy(0,head);// 双指针起跑线都设在 dummyListNode*predummy,*postdummy;// 只要前面的探路者 post 还没走到尽头while(post-next!nullptr){// 当倒计时 n 归零或小于零时唤醒 pre 同步移动if(n0){prepre-next;}postpost-next;n--;}// 此时 pre 刚好站在倒数第 n 个节点的前驱位置// 直接跨过倒数第 n 个节点pre-nextpre-next-next;// 返回 dummy.next 即为真实头节点returndummy.next;}};