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
时会发生什么:
为True,则将如果值中的node.item
设置为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