返回

LeetCode 019:逐个剖析,删除链表倒数第 N 个结点

IOS

在 LeetCode 的题库中,HOT100 题目以其经典性、代表性而闻名。今天,我们一起来挑战 HOT100 中的第 19 题:删除链表的倒数第 N 个结点。

背景介绍

链表是一种广泛应用于计算机科学中的数据结构,它由一组相互连接的结点组成,每个结点包含一个值和指向下一个结点的指针。删除链表中的特定结点是一个常见且关键的操作。

题目

给你一个链表的头节点 head 和一个整数 n,请删除链表的倒数第 n 个结点,并返回链表的头节点。

示例

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

解题思路

这道题目的本质是找到链表中倒数第 n 个结点,并将其删除。我们可以采用以下步骤解决问题:

  1. 遍历链表,计算长度 :首先,遍历链表,计算其长度 length
  2. 找到倒数第 N 个结点 :根据 lengthn,计算倒数第 n 个结点的索引 index。索引 indexlength - n
  3. 删除结点 :遍历链表到索引 index 处,将该结点从链表中删除。

代码实现

def remove_nth_from_end(head: Optional[ListNode], n: int) -> Optional[ListNode]:
    # 1. 遍历链表,计算长度
    length = 0
    curr = head
    while curr:
        length += 1
        curr = curr.next

    # 2. 找到倒数第 N 个结点的索引
    index = length - n

    # 3. 删除结点
    if index == 0:
        return head.next
    
    curr = head
    prev = None
    while index > 0:
        prev = curr
        curr = curr.next
        index -= 1
    
    prev.next = curr.next
    return head

复杂度分析

  • 时间复杂度:O(n) ,其中 n 是链表的长度。
  • 空间复杂度:O(1) ,因为我们不需要额外的空间。

总结

通过逐个剖析 LeetCode 019 题,我们掌握了删除链表倒数第 n 个结点的算法。这种解题思路既简单又高效,适用于解决各种链表操作问题。

此外,解决 LeetCode 题目的过程不仅可以提高我们的编程能力,还可以培养我们的算法思维。通过每天坚持刷题,相信我们可以逐渐养成持续学习的习惯,在计算机科学领域不断提升自己。