删除重复项

时间:2021-06-07 14:16:19

标签: python list linked-list

我正在编写一个从未排序列表中删除重复项的函数。 这是代码

class Node:
    def __init__(self, item=None):
        self.item = item
        self.next = None


class Linked_List:
    def __init__(self):
        self.head = None

    def append(self, value):
        new_node = Node(value)
        if self.head is None:
            self.head = new_node
            return
        current_node = self.head
        while (current_node.next):
            current_node = current_node.next

        current_node.next = new_node

    def pre_append(self, value):
        new_node = Node(value)
        new_node.next = self.head
        self.head = new_node

    def delete(self, value):
        current = self.head
        if current is None:
            return
        while (current.next is not None):
            if (current.next.data == value):
                current.next = current.next.next
                return
        if current.data == value:
            current = current.n
    def print_list(self):
        node = self.head
        listOfNodes = []
        while node:
            listOfNodes.append(node.item)
            node = node.next
        print(listOfNodes)
    def remove_dups(self):
        node = self.head
        prev = node.next
        values = []
        while node is not None:
            if node.item in values:
                print(node.next)
                node.next = node.next.next
            values.append(node.item)
            node = node.next







if __name__ == "__main__":
    duplicated = Linked_List()
    duplicated.append(1)
    duplicated.append(5)
    duplicated.append(8)
    duplicated.append(5)
    duplicated.append(4)
    duplicated.remove_dups()
    duplicated.print_list()

输出而不是被 [1, 5, 8, 4] 是 [1, 5, 8, 5] 有人可以向我解释为什么吗?我无法理解这个问题,因为我在代码中声明 node.next 应该等于 node.next.next 。 提前致谢。

1 个答案:

答案 0 :(得分:2)

你的循环是:

while node is not None:
    if node.item in values:
        print(node.next)
        node.next = node.next.next
    values.append(node.item)
    node = node.next

考虑当您到达 5 中的第二个 [1, 5, 8, 5, 4] 时会发生什么:

  • if node.item in values 为 True,因此您将 node.next 设置为 node.next.next,从而有效地跳过 next 项(4),不是当前的。
  • 您将 node.item 附加到 values,将重复值 5 添加到输出列表中。
  • 您移至 node.next,跳过下一个值(4)。

您可以做的一件事是检查下一个节点而不是当前节点,这样您就可以跳过它而无需导航到它,例如(未经测试的代码):

while node is not None:
    if node.next.item in values:
        node.next = node.next.next
    values.append(node.item)
    node = node.next

请注意,这不会处理重复链,您可能需要在那里进行额外的循环才能找到下一个非重复节点。我的示例仅用于演示。

相关问题