我正在编写一个从未排序列表中删除重复项的函数。 这是代码
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 。 提前致谢。
答案 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
请注意,这不会处理重复链,您可能需要在那里进行额外的循环才能找到下一个非重复节点。我的示例仅用于演示。