删除链表中所有重复的元素

时间:2019-06-30 04:10:50

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

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

示例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'对象没有属性'val'”。

2 个答案:

答案 0 :(得分:0)

您可以在$ 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。因此,此操作计算每个值出现多少次,然后删除所有显示多次的内容。

答案 1 :(得分:0)

代码工作正常,我只需要将return []更改为简单的“ return”,因为[]未被识别为空链表,而是一个空列表。感谢Devesh Kumar Singh识别此错误,但他没有将其发布为答案,因此我代表他进行了发布。