LC 19链表中等第 30 / 95 题

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

Remove Nth Node From End of List

快慢指针哑节点
本机进度仅保存在当前浏览器

题目描述

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。要求使用一趟扫描实现。

示例:1 -> 2 -> 3 -> 4 -> 5,n = 2,删除倒数第 2 个后为 1 -> 2 -> 3 -> 5。

解题思路

  1. 要删除倒数第 n 个节点,需要找到它的前驱节点;两趟扫描(先算长度)容易,一趟扫描用快慢指针。
  2. 快指针先走 n + 1 步,随后快慢指针同步前进;快指针到尾部时,慢指针恰好停在倒数第 n + 1 个节点(前驱)。
  3. 用哑节点指向头部,统一处理"删除头节点"的边界情况。

参考实现

查看参考实现Python · 建议先自行作答
def removeNthFromEnd(head, n):
    # 快指针先走 n+1 步,慢指针停在待删节点的前驱
    dummy = ListNode(0, head)
    fast = slow = dummy
    for _ in range(n + 1):
        fast = fast.next
    while fast:
        fast = fast.next
        slow = slow.next
    slow.next = slow.next.next
    return dummy.next

复杂度与归属

时间复杂度O(n)
空间复杂度O(1)
所属分类链表
题源LeetCode 19

关联教程

返回题图鉴