返回

二种方法让你写出最简洁的代码删除链表的倒数第 N 个结点

前端

前言

链表是一种常见的数据结构,它存储数据元素并将其连接起来,形成一个序列。在许多编程任务中,我们可能需要删除链表中的某个结点,例如删除倒数第 N 个结点。

问题

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

方法一:使用一趟扫描

以下是使用一趟扫描实现的代码:

def remove_nth_from_end(head, n):
    dummy = ListNode(0)
    dummy.next = head
    first = dummy
    second = dummy
    # 让 first 指针先走 n 步
    for _ in range(n):
        first = first.next
    # 然后 firstsecond 指针一起走,直到 first 指针到达链表末尾
    while first.next:
        first = first.next
        second = second.next
    # 将 second 指针指向要删除的结点的下一个结点
    second.next = second.next.next
    return dummy.next

这种方法的复杂度为 O(n),因为它只需要遍历链表一次。

方法二:使用两个指针

以下是使用两个指针实现的代码:

def remove_nth_from_end(head, n):
    # 计算链表的长度
    length = 0
    current = head
    while current:
        length += 1
        current = current.next
    # 找到要删除的结点的前一个结点
    previous = None
    current = head
    for _ in range(length - n):
        previous = current
        current = current.next
    # 删除要删除的结点
    if previous:
        previous.next = current.next
    else:
        head = current.next
    return head

这种方法的复杂度为 O(n),因为它需要遍历链表两次。

结论

我们已经为各位读者提供了两种简洁的代码来解决LeetCode 19: 删除链表的倒数第 N 个结点这个问题。方法之一使用一趟扫描,该方法更简洁、更高效,并且可以消除对计算列表长度的需要。方法之二使用两个指针来删除倒数第 N 个结点,这是一个更传统的方法。无论选择哪种方法,我们都为各位读者提供了清晰的步骤指南和一个易于理解的示例,帮助各位读者更好地理解和掌握如何解决这个问题。