【力扣-19. 删除链表的倒数第n个节点 ✨】Python笔记

链表中的"神行太保":如何优雅地删除倒数第N个节点(只遍历一次!)

📚 核心知识点:双指针与虚拟头节点

链表操作常面临两个痛点:不知道链表总长度导致无法直接定位倒数第N个节点,以及删除头节点时普通遍历逻辑容易失效。解决方案是双指针技巧和虚拟头节点的配合使用。

双指针通过快慢指针拉开距离定位目标节点,虚拟头节点则统一删除逻辑避免边界问题。

📝 题目解析:LeetCode 19. 删除链表的倒数第 N 个结点

给定链表和整数n,要求删除倒数第n个节点并返回头节点。例如输入[1,2,3,4,5]和n=2时,应删除节点4得到[1,2,3,5]。

💡 解题思路:拉开距离,同步前行

建立虚拟头节点指向真实头节点,初始化快慢指针到虚拟节点。快指针先移动n步拉开距离,随后两指针同步移动直至快指针到达末尾。此时慢指针位于目标节点的前驱位置,执行删除操作即可。

💻 代码实现(Python)

链表删除倒数第N个节点的最优解法

核心思路:双指针法

使用快慢指针技术可以在一次遍历中完成操作。快指针先移动N步,然后快慢指针同时移动,当快指针到达链表末尾时,慢指针正好指向需要删除节点的前驱节点。

具体实现步骤

创建虚拟头节点(dummy node)指向链表头部,这样可以统一处理删除头节点的情况。初始化快慢指针都指向虚拟头节点。

快指针先向前移动N步,使快慢指针之间保持N个节点的距离。然后同时移动快慢指针,直到快指针到达链表末尾。

此时慢指针指向要删除节点的前一个节点,执行删除操作:slow.next = slow.next.next。最后返回dummy.next作为新链表的头节点。

代码实现(Python)
python 复制代码
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dummy = ListNode(0, head)
        slow = fast = dummy
        
        for _ in range(n):
            fast = fast.next
            
        while fast.next:
            slow = slow.next
            fast = fast.next
            
        slow.next = slow.next.next
        return dummy.next
复杂度分析

时间复杂度:O(L),其中L是链表长度,只需遍历链表一次。 空间复杂度:O(1),只使用了常数级别的额外空间。

边界情况处理

当链表只有一个节点且n=1时,虚拟头节点确保能正确处理删除操作。 当n等于链表长度时,能正确删除头节点。

🔍 深度图解:为什么要停在"前一个"位置

以链表1->2->3->4->5删除倒数第2个节点为例:

  1. 初始状态:dummy->1->2->3->4->5,快慢指针在dummy
  2. 快指针移动两步到节点2
  3. 同步移动直至快指针到节点5,慢指针到节点3
  4. 删除slow.next即节点4
📌 总结与拓展

虚拟头节点解决删除头节点的边界问题,使逻辑统一。该算法时间复杂度O(L)(L为链表长度),空间复杂度O(1),是双指针技巧的典型应用,可扩展解决查找链表中点等问题。

相关推荐
打工仔折腾 AI9 分钟前
FaceFusion本地换脸实战:Windows整合包、模型选择与遮罩调参记录
人工智能·windows·后端·python·深度学习·性能优化·ai agent 实战
yi0119 分钟前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
木井巳10 分钟前
【BFS 解决拓扑排序】课程表
java·算法·leetcode·广度优先·宽度优先·推荐算法·图搜索算法
kimnoic21 分钟前
Python常用命令提示符使用方法详解
开发语言·python
Είναι η κοπέλα34 分钟前
模型量化完全指南:GGUF、GPTQ、AWQ 怎么选
人工智能·pytorch·python
yi01138 分钟前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
weixin199701080161 小时前
《1688消息服务落地方案:alibaba.message.* 与 Webhook 回调的可靠性与重试策略》(附Python源码)
开发语言·python
一只专注api接口开发的技术猿1 小时前
Open‑Claw 实战|告别页面逆向,快速搭建电商商品监控与数据分析完整方案
大数据·数据库·python·数据挖掘·数据分析
忆~遂愿1 小时前
免密连接+快捷键+虚拟鼠标:ToDesk远程操作AI效率拉满
人工智能·python·深度学习·神经网络·自然语言处理·计算机外设·安全架构
ComPDFKit1 小时前
用 ComPDF DocSlight 提取 PDF 表格:三种样本实测与 Python 接入
开发语言·python·pdf·pdf表格提取