【问题标题】:Delete node at nth position from the end of a list (Leet code problem 19)从列表末尾删除第n个位置的节点(Leet代码问题19)
【发布时间】:2023-03-30 23:20:01
【问题描述】:

我正在尝试解决 LeetCode 挑战 19. Remove Nth Node From End of List

给定链表的head,从链表的末尾删除nth节点并返回它的头。

约束

  • 列表中的节点数为sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

下面是我的功能。它使用 2 指针方法。它适用于许多测试用例,除了这个:

  • 链表 = [1,2,3]
  • n = 3
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
    if head is None or head.next is None:
        return None
    if head.next.next is None :
        if(n ==1):
            head.next = None
            return head
        if(n == 2):
            head = head.next
            return head 
            
    slow_pointer = head 
    fast_pointer = head
    for i in range(n+1):
        fast_pointer = fast_pointer.next
    while(fast_pointer is not None):
        fast_pointer = fast_pointer.next
        slow_pointer = slow_pointer.next
    slow_pointer.next = slow_pointer.next.next
    return head

我哪里做错了?

【问题讨论】:

  • 我相信应该是for i in range(n)。您收到的是异常,还是只是磨损的结果?

标签: python linked-list recursive-datastructures


【解决方案1】:

您的代码没有处理需要删除head 节点的一般情况。一开始它确实处理了一些这样的情况(当列表的大小小于 3 时),但这显然对更大的列表不起作用。

问题是当n是列表的大小时,那么这个循环在最后一次迭代中会出错,因为它会以fast_pointer开始等于None

for i in range(n+1):
    fast_pointer = fast_pointer.next

因此,您应该单独处理最后一次迭代,而不是作为此循环的一部分。尽可能缩短循环一次迭代,并单独执行最后一次“移动”:

for i in range(n):
    fast_pointer = fast_pointer.next
if fast_pointer is None:
    return head.next  # remove first node
fast_pointer = fast_pointer.next

...然后你的代码的最后部分可以保持原样。

通过此更改,您实际上不必在代码开头处理那么多特殊情况。事实上,(在 LeetCode 上)列表将有至少一个节点。所以你实际上没有任何边界情况需要处理。

应用这些更改,您的代码变为:

def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
    slow_pointer = head 
    fast_pointer = head
    for i in range(n):
        fast_pointer = fast_pointer.next
    if fast_pointer is None:
        return head.next  # remove first node
    fast_pointer = fast_pointer.next
    while fast_pointer is not None:
        fast_pointer = fast_pointer.next
        slow_pointer = slow_pointer.next
    slow_pointer.next = slow_pointer.next.next
    return head

【讨论】:

  • 非常感谢特林科特。这是一个非常清楚的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多