【问题标题】:Remove Nth Node From End of List(Leetcode)? - Python从列表末尾删除第 N 个节点(Leetcode)? - Python
【发布时间】:2020-05-05 09:44:09
【问题描述】:

链接 - https://leetcode.com/problems/remove-nth-node-from-end-of-list/

我的方法:

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        h = head
        td = h

        c = 0
        while head.next is not None:
            c+=1
            print(c,n)
            if c>n:
                td = td.next
            head = head.next
        if c + 1 != n:
            td.next = td.next.next
        return h

它在 [1,2] 和 n = 2 等边界情况下失败,有什么方法可以修改它以使其适用于所有边界情况并被接受? (我知道我们可以使用慢速和快速指针来解决这个问题)

【问题讨论】:

  • 你的代码甚至不是pythonic...
  • 能否详细说明。
  • 首先,如果您使用的是 python 类,您需要在 def__init__() 中定义“self”是什么。然后,'def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:' 不是你应该定义一个函数的变量的方式。你能检查一下你在复制时是否犯了一些错误吗?
  • 这只是 leetcode 的包装方式,让我们知道预期的内容。它类似于“ def removeNthFromEnd(self, head, n):”和“ListNode”是为我们定义的。我们唯一的工作就是正确地编写函数,仅此而已。这就是我的逻辑失败的地方,只需从逻辑角度看一下。
  • 但恐怕这不是 SO 提出问题的方式,在这里你最好给出你的代码和输入的最小可重现示例。

标签: python linked-list reverse


【解决方案1】:

如果您有兴趣,我已经发布了一个替代解决方案。

class Solution:
    def removeNthFromEnd(self, head, n):
        fast = slow = head
        for _ in range(n):
            fast = fast.next
        if not fast:
            return head.next
        while fast.next:
            fast = fast.next
            slow = slow.next
        slow.next = slow.next.next
        return head

【讨论】:

    【解决方案2】:

    我们使用两个指针技术。 "fast_pointer" 必须比 "slow_pointer" 提前 "n" 步,所以当我们到达链表末尾时,慢指针将是我们要删除的节点。

    假设我们有 5 个节点,我们想从末尾删除第二个节点。

    当我们到达列表的末尾时,“slow_pointer”将指向我们要删除的节点。但是我们要如何删除它呢?为了从链表中删除一个节点,它的前一个节点应该指向它的下一个节点。在这个例子中,我们要删除第 3 个节点,所以第 2 个 node.next 应该指向第 4 个节点,因为我们没有第 3 个节点的引用,所以它将被垃圾回收,将被删除。

    所以,我们要创建一个虚拟节点,它的值并不重要,但它的下一个将指向链表的“头”。我们的慢速指针将从 dummy 开始。

    class Solution:
        def remove(self,head:ListNode,n:int)->ListNode:
            dummy=ListNode(0,head)
            slow=dummy
            fast=head
            while n>0 and fast:
                fast=fast.next
                n-=1
            while fast:
                slow=slow.next
                fast=fast.next
            # now delete it
            slow.next=slow.next.next
            return dummy.next
    
    
    class ListNode:
        def __init__(self,val,next=None):
            self.val=val
            self.next=next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多