簡體   English   中英

刪除重復的Python循環鏈接列表

[英]Remove Duplicates Python Circular Linked List

必須刪除相同值的重復出現。 如果從頭開始遍歷的(鏈接)列表在調用后包含序列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,因此很難做到這一點。

您需要跟蹤每個節點的值以及起始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]

遍歷循環列表,丟棄已經出現的值(但首先檢查是否已查看該節點)。

基本上,從頭開始,每次檢查節點的值是否在集合中。 如果不是,則將值添加到集合中並繼續。 否則,請刪除該節點(將上一個節點和下一個節點連接在一起)。當您回到第一個節點時(永遠不會刪除第一個節點),請停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM