Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除重复项_Python_List_Linked List - Fatal编程技术网

Python 删除重复项

Python 删除重复项,python,list,linked-list,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(

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

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。 提前感谢。

您的循环是:

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
考虑当您到达
[1,5,8,5,4]
中的第二个
5
时会发生什么:

  • 如果值中的node.item
    为True,则将
    node.next
    设置为
    node.next.next
    ,有效地跳过下一项(即
    4
    ),而不是当前项
  • 节点项
    附加到
    ,将重复值
    5
    添加到输出列表中
  • 移动到
    节点。下一个
    ,跳过下一个值(
    4
您可以做的一件事是检查下一个节点而不是当前节点,这样您就可以跳过它而不导航到它,例如(未测试的代码):


请注意,这不会处理重复链,您可能需要在其中添加一个额外的循环来查找下一个非重复节点。我的示例仅供演示。

您可以使用
set()
来删除重复项并获取唯一值。@PCM这是一个链接列表set()有什么作用?所以node.next=node.next.next跳过4而不是5对吗?是的。您当前正在检查的节点是应跳过的重复节点。如果发现它是重复的,则需要更新上一个节点的
next
指针,并且需要直接跳到当前节点的
next
。为了让生活更轻松,你可能想向前看,检查下一个,而不是检查当前的。我会写一个简单的例子。没问题,我想出来了,非常感谢muchi制作了这个prev=self.head node=prev.next values=[],而node不是None:if node.item in values:prev.next=prev.next.next values.append(node.item)node=node.next prev=prev.next,它似乎是正确的
while node is not None:
    if node.next.item in values:
        node.next = node.next.next
    values.append(node.item)
    node = node.next