📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 37(1)

📅  最后修改于: 2023-12-03 14:50:48.565000             🧑  作者: Mango

ISRO CS 2020 - Question 37

问题描述

给定一个链表,删除链表的倒数第n个节点,并返回链表的头节点。

例如,

给定一个链表:1->2->3->4->5,以及 n = 2。

当删除了倒数第二个节点后,链表变为1->2->3->5。

注意:

  1. 给定的 n 保证是有效的。
  2. 尝试使用一趟扫描实现。
函数签名
def remove_nth_node_from_end_of_list(head: ListNode, n: int) -> ListNode:
    pass
输入
  • head:链表头节点。1 <= len(head) <= 30
  • n:正整数。
输出

返回处理后的链表的头节点。

示例
示例1

输入:

head = [1,2,3,4,5], n = 2

输出:

[1,2,3,5]

解释:

我们需要找到倒数第2个节点。为此,我们可以使用两个指针——快指针和慢指针。

首先,让快指针向前走 n 步。 然后,同时移动快慢指针,直到快指针达到链表末尾。

删除第N个节点。
示例2

输入:

head = [1], n = 1

输出:

[]
示例3

输入:

head = [1, 2], n = 1

输出:

[1]
实现

为了删除从列表末尾数的第N个节点,我们需要知道删除指向的节点的前一个节点的位置。

为此,我们可以使用两个指针——快指针和慢指针。

  1. 让快指针向前走 n 步。
  2. 然后,同时移动快慢指针,直到快指针达到链表末尾。
  3. 最后,将慢指针的下一个节点指向下下个节点,以删除第N个节点。
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def remove_nth_node_from_end_of_list(head: ListNode, n: int) -> ListNode:
    dummy = ListNode(0)
    dummy.next = head
    fast = slow = dummy

    # Move the fast pointer n steps ahead
    for i in range(n):
        fast = fast.next

    # Move the slow pointer and the fast pointer together
    while fast.next is not None:
        fast = fast.next
        slow = slow.next

    # Remove the nth node from the end
    slow.next = slow.next.next

    return dummy.next