必须删除相同值的重复出现。如果从头开始遍历的(链接)列表在调用
后包含序列3,2,8,8,8,5,2,3last = Node(3)
head = Node(2, last)
head = Node(5, head)
head = Node(8, head)
head = Node(8, head)
head = Node(8, head)
head = Node(2, head)
head = Node(3, head)
last.next = head
现在,从头部开始的列表应包含3个,2个,8个,5个,2个或2个,8个,5个,2个,3个。 'head'的值等于None表示空列表(具有零元素的列表)。我怎么做到这一点。这可能是最容易实现的方法之一。因为我是Python的新手,所以很难做到这一点。
答案 0 :(得分:1)
您需要跟踪每个节点和起始Node
对象本身的值,因为这是一个循环链表。您Node
类的代码可能不同,但修改函数应该很容易。
class Node(object):
def __init__(self, data, next_=None):
self.data = data
self.next = next_
def ll_remove_dups(curr):
start_node = curr
values_seen = {curr.data}
while curr.next is not start_node:
if curr.next.data in values_seen:
curr.next = curr.next.next
else:
values_seen.add(curr.next.data)
curr = curr.next
def ll_traverse(curr):
start_node = curr
yield curr.data
while curr.next is not start_node:
yield curr.next.data
curr = curr.next
if __name__ == "__main__":
last = Node(3)
head = Node(3, Node(2, Node(8, Node(8, Node(8, Node(5, Node(2, last)))))))
last.next = head
print list(ll_traverse(head)) # [3, 2, 8, 8, 8, 5, 2, 3]
ll_remove_dups(head)
print list(ll_traverse(head)) # [3, 2, 8, 5]
答案 1 :(得分:0)
迭代循环列表,丢弃已经出现的值(但首先检查是否已查看该节点)。
基本上,从头开始,每次检查节点的值是否在一个集合中。如果没有将值添加到集合并继续。否则,删除节点(将前一个节点和下一个节点连接在一起)当您回到第一个节点时(您永远不会删除第一个节点),停止。