[英]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.