返回

连破难题:删除链表倒数第 N 个结点,一招搞定!

前端

巧用双指针法:高效删除链表倒数第 N 个结点

在数据结构和算法领域,链表扮演着不可或缺的角色。作为一种线性数据结构,链表由一系列按照顺序连接的结点组成。处理链表时,删除结点是不可避免的操作,而删除链表倒数第 N 个结点尤其具有挑战性。

初识双指针法

解决这一问题,双指针法脱颖而出。它是一种优雅高效的算法,利用两个指针逐个遍历链表。在删除倒数第 N 个结点时,我们将使用 slowfast 两个指针:

  • slow 指针从链表头结点出发,每次向后移动一步。
  • fast 指针同样从链表头结点出发,但每次向后移动 N 步。

算法流程

双指针法的运作过程清晰明了:

  1. 初始化 slowfast 指针,都指向链表头结点。
  2. fast 指针向后移动 N 步。
  3. 同时移动 slowfast 指针,直到 fast 指针到达链表尾部。
  4. 此时,slow 指针恰好位于倒数第 N 个结点的前面。
  5. 删除 slow 指针指向的结点。

代码实现

为了更好地理解算法的具体实现,我们以 Python 为例,编写如下代码:

def remove_nth_from_end(head, n):
    """
    删除链表倒数第 N 个结点

    :param head: 链表头结点
    :param n: 要删除的倒数第 N 个结点
    :return: 删除后的链表头结点
    """
    if not head:
        return None

    slow = head
    fast = head

    # 移动 fast 指针 N 步
    for _ in range(n):
        fast = fast.next

    # 如果 fast 指针到达尾部,则表示要删除的是头结点
    if not fast:
        return head.next

    # 同时移动 slow 和 fast 指针
    while fast.next:
        slow = slow.next
        fast = fast.next

    # slow 指针此时指向倒数第 N 个结点的前面,删除该结点
    slow.next = slow.next.next

    return head

性能优势

双指针法高效卓越,其时间复杂度为 O(n),其中 n 为链表长度。这是因为算法仅遍历链表一次,大大降低了计算成本。

总结

掌握双指针法,你将具备解决链表倒数第 N 个结点删除问题的能力。这种算法简单易懂,性能优越,是链表操作中的强大工具。下次面对类似场景,不妨尝试双指针法,它将助你轻松应对。

常见问题解答

1. 双指针法如何删除链表倒数第 N 个结点?

通过使用两个指针 slowfast 同时遍历链表,当 fast 指针到达链表尾部时,slow 指针恰好位于倒数第 N 个结点的前面,此时删除 slow 指针指向的结点即可。

2. 双指针法的时间复杂度是多少?

O(n),其中 n 为链表长度。

3. 双指针法有哪些应用场景?

除了解决链表倒数第 N 个结点的删除问题外,双指针法还广泛应用于判断链表是否有环、反转链表、求链表中间结点等场景。

4. 使用双指针法需要注意什么?

需要注意特殊情况,例如当 N 大于链表长度时,以及当要删除的结点是头结点时。

5. 双指针法的优点有哪些?

简单易懂、性能优越、适用于各种链表操作场景。