当前位置: 首页 > news >正文

python-leetcode-删除链表的倒数第 N 个结点

LCR 021. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

可以使用双指针方法来解决这个问题,这样可以在一次遍历内完成删除操作,从而达到 O(n) 的时间复杂度。以下是 Python 代码实现:

解题思路:

  1. 初始化快慢指针:使用两个指针 fastslow,都指向头结点。
  2. 快指针先走 n 步:这样当快指针到达链表末尾时,慢指针正好指向倒数第 n 个节点的前一个节点。
  3. 同时移动快慢指针:直到快指针到达链表的末尾。
  4. 删除目标节点:调整前一个节点的 next 指针。

Python 代码:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
    dummy = ListNode(0, head)  # 添加哑节点,方便处理边界情况
    fast = slow = dummy  # 快慢指针初始化指向哑节点

    # 让快指针先走 n+1 步,这样 slow 指向待删除节点的前一个节点
    for _ in range(n + 1):
        fast = fast.next

    # 同时移动快慢指针,直到快指针到达链表尾部
    while fast:
        fast = fast.next
        slow = slow.next

    # 删除倒数第 n 个节点
    slow.next = slow.next.next

    return dummy.next  # 返回真正的头节点

复杂度分析

  • 时间复杂度: O(n),只遍历了一次链表。
  • 空间复杂度: O(1),只用了常数级额外空间。

示例

# 构造链表 1 -> 2 -> 3 -> 4 -> 5
head = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))

# 删除倒数第 2 个节点
new_head = removeNthFromEnd(head, 2)

# 打印新链表
cur = new_head
while cur:
    print(cur.val, end=" -> ")
    cur = cur.next
# 输出:1 -> 2 -> 3 -> 5 ->

这个方法使用了 哑节点(dummy node),有效地避免了删除头节点的特殊情况,使代码更加简洁稳健。

相关文章:

  • 批量将 Excel 文档中的图片提取到文件夹
  • MySQL -- 数据类型
  • Java 枚举
  • SpringBoot自动装配的工作原理
  • python-docx - 读写更新 .docx 文件(Microsoft Word 2007+ )
  • Django系列教程(7)——路由配置URLConf
  • SpringBoot 入门基础
  • OBS推WebRTC流,并添加毫秒级时间显示
  • 【C++11】auto decltype nullptr
  • C++ 函数重载
  • 【Linux篇】进程状态(僵尸进程,孤儿进程),优先级与调度机制
  • BUUCTF逆向刷题笔记(13-?)持续更新
  • 【leetcode hot 100 24】两两交换链表中的节点
  • vulnhub-DC-9 SQL注入、“ssh端口敲门”、hydra爆破
  • 题解:AT_arc093_b [ABC092D] Grid Components
  • Python规则引擎DIY:从零开始构建规则引擎
  • Linux》》Ubuntu22.04下Docker的安装 Docker
  • 【VS】vs生成前事件,复制脚本文件至运行目录
  • Python Numpy面试题及参考答案 草
  • Prompt 工程
  • 上海乐高乐园建设进入最后冲刺,开园限量纪念年卡将于5月开售
  • 原创话剧风向标!这个展演上《大宅门》《白鹿原》先后上演
  • 伊朗爆炸港口已恢复货物进出口工作
  • 视频丨伊朗港口爆炸事件灭火工作已完成80%
  • “归雁经济”能带来什么?川大商学院调研团队深入乡村与返乡青年人才交流
  • 民生访谈|公共数据如何既开放又安全?政务领域如何适度运用人工智能?