簡體   English   中英

在Python中重新排序鏈接列表

[英]Re-ordering a Linked List in Python

我意識到使用內置列表類型可以更好地完成這種數據結構,但是出於學術原因,我試圖對此進行更多的了解。 鑒於我有一個像這樣的鏈表:

a-> b-> c-> d-> e-> f

我想將引用更改為

b-> a-> d-> c-> f-> e

換句話說,每對都被交換。 我正在使用這兩個類來創建鏈接列表。

class Node:
    def __init__(self):
        self.cargo = None 
        self.next = None 

class LinkedList:
    def __init__(self):
        self.cur_node = None

    def add_node(self, cargo):
        new_node = Node() 
        new_node.cargo = cargo
        new_node.next = self.cur_node 
        self.cur_node = new_node

    def print_list(self):
        node = self.cur_node
        while node:
            print node.cargo
            node = node.next

    def reorder(self):
        # missing code here!


ll = LinkedList()
ll.add_node("a")
ll.add_node("b")
ll.add_node("c")
ll.add_node("d")
ll.add_node("e")
ll.add_node("f")
ll.reorder()
ll.print_list()

有任何想法嗎?

有時最好的辦法是首先考慮“最佳解決方案的速度有多快?” 顯然,這似乎是O( length ),所以遍歷列表(最好一次)的內容將盡可能地好。

鑒於此,您可能會發現最簡單的選擇是最好的。 用偽代碼,它將是

 get the first element in left
 get the second element in right
 append them to a new list as right->left
 repeat until you run out of list.

正如Matt和Jodaka所指出的,如果根本不允許使用奇數長度列表,則需要決定如何處理奇數長度列表。

令我感到遺憾的是,“帶有空頭的雙向鏈接列表”數據結構還沒有流行起來。 在這種結構中,每個節點都指向其上一個和下一個元素, 並且列表本身以一個空節點開頭,該節點僅是一個頭,實際上並沒有任何數據。 在初始的空列表中,空頭節點的next和prev指針指向該節點本身。 通過這種簡單的初始化,幾乎所有的“如果next不為None”或“如果prev不為None”的東西都可以實現其余的鏈接和取消鏈接代碼-next和prev指針永遠不會為 None! 查看add_before,add_after和remove的簡單性,然后查看重新排序的難易程度。 像雙端隊列一樣,插入到列表的開頭或結尾是O(1)-只需調用self.header.add_after插入到頭部,或者self.header.add_before插入到結尾。

class Node:
    def __init__(self):
        self.cargo = None 
        self.next = self
        self.prev = self

    def add_after(self, other):
        other.next = self.next
        other.prev = self
        self.next.prev = other
        self.next = other

    def add_before(self, other):
        other.next = self
        other.prev = self.prev
        other.prev.next = other
        self.prev = other


class LinkedList:
    def __init__(self):
        self.header = Node()

    def __bool__(self):
        return self.header.next != self.header
    __nonzero__ = __bool__  # for older Pythons

    def empty(self):
        return not self

    def add_node(self, cargo):
        new_node = Node() 
        new_node.cargo = cargo
        self.header.add_before(new_node)

    @staticmethod
    def pop(node):
        node.prev.next = node.next
        node.next.prev = node.prev
        node.next = node.prev = node
        return node

    def print_list(self):
        node = self.header.next
        while node != self.header:
            print node.cargo
            node = node.next

    def reorder(self):
        node = self.header.next
        while node != self.header and node.next != self.header:
            node.add_before(self.pop(node.next))
            node = node.next


ll = LinkedList()
ll.add_node("a")
ll.add_node("b")
ll.add_node("c")
ll.add_node("d")
ll.add_node("e")
ll.add_node("f")
ll.print_list()
ll.reorder()
ll.print_list()

暫無
暫無

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

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