0

必须删除重复出现的相同值。如果从head遍历的(链表)在调用后包含序列3,2,8,8,8,5,2,3

last = 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

现在,从 head 遍历的列表应该包含 3、2、8、5、2 或 2、8、5、2、3。 'head' 的值等于 None 表示一个空列表(一个具有零元素的列表) . 我将如何实现这一目标。这可能是最容易实现的方法之一。由于我是 Python 新手,因此很难做到这一点。

4

2 回答 2

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]
于 2013-08-27T06:12:38.160 回答
0

遍历循环列表,丢弃已经出现的值(但首先检查该节点是否已经被查看)。

基本上是从头开始,每次检查节点的值是否在一个集合中。如果不是将值添加到集合中并继续。否则,删除节点(将前一个节点和下一个节点连接在一起)当你回到第一个节点时(你永远不会删除第一个节点),停止。

于 2013-08-27T05:32:13.867 回答