【问题标题】:Removing all repeated elements in a linked list删除链表中所有重复的元素
【发布时间】:2019-06-30 04:10:50
【问题描述】:

给定一个排序链表,删除所有重复编号的节点,只留下原始列表中不同的编号。

示例 1:

Input: 1->2->3->3->4->4->5
Output: 1->2->5

示例 2:

Input: 1->1->1->2->3
Output: 2->3

我已经在大多数情况下尝试并成功地编写了我的代码,我唯一缺少的情况是列表以重复结尾并且整个过程中没有重复。

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        first = head
        if first is None:
            return []
        second = head.next
        if second is None:
            return first
        first.next = second
        if first.val == first.next.val:
            while first.val == first.next.val:
                if first.next.next is None:
                    return []
                first = first.next
            return self.deleteDuplicates(first.next)
        else:
            first.next = self.deleteDuplicates(first.next)
            return first

我得到的 [1,2,3,4,4] 错误是“AttributeError: 'list' object has no attribute 'val'”。

【问题讨论】:

  • 你为什么要return [],这是你犯错的罪魁祸首
  • 天哪,这是问题,非常感谢,我确实返回了 [],因为在之前的问题中,这将是最终输出,所以很好。我将其更改为“返回”并且代码有效!

标签: python python-3.x linked-list


【解决方案1】:

假设你的数据是可散列的,你可以在 $O(n)$ 时间和 $O(n)$ 空间(最坏情况)内完成此操作,只需跟踪你目前看到的内容。

from collections import defaultdict

def mark_duplicates(current_node, seen_so_far):
    next = current_node.next
    seen_so_far[current_node.data] += 1
    if next is None: return seen_so_far
    return mark_duplicates(next, seen_so_far)

def remove_duplicates(current_node, seen):
    next = current_node.next
    prev = current_node.prev
    if seen[current_node.data] > 1:
        if prev is not None: prev.next = next
        if next is not None: next.prev = prev
        # No need to delete current_node, the GC will do it
    if next is not None: remove_duplicates(next, seen)

notes = mark_duplicates(head_of_list, defaultdict(int))
remove_duplicates(head_of_list, notes)

defaultdict(int) 只是一个字典,当您尝试访问不存在的键时,它会返回 0。所以这会计算每个值出现的次数,然后删除出现多次的所有内容。

【讨论】:

  • 感谢您的帮助,但我很清楚还有其他方法可以解决此问题,而且大多数方法可能更有效。我想知道的是为什么我的方法在我提到的特定情况下不起作用。
【解决方案2】:

代码工作正常,我只需将 return [] 更改为简单地“return”,因为 [] 没有被识别为空链表,而只是一个空链表。感谢 Devesh Kumar Singh 认识到这个错误,但他没有将其作为答案发布,所以我代表他发布。

【讨论】:

  • 您无需代表我发布答案,因为这是您代码中的拼写错误,不太可能帮助未来的读者查看您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
相关资源
最近更新 更多