雙向鏈表
雙向鏈表:每一個元素都是一個對象,每個對象有一個關鍵字key和兩個指針:next和prev
在雙向鏈表的實現中,使用一個僞頭部(dummy head)和僞尾部(dummy tail)標記界限,這樣在添加節點和刪除節點的時候就不需要檢查相鄰的節點是否存在。
- 雙向鏈表:每一個元素都是一個對象(DLinkedNode類的實例),每個對象有一個關鍵字key和兩個指針:next和prev
class DLinkedNode:
def __init__(self, key=0, value=0):
self.key = key
self.value = value #內容區域,可自定義多個字段
self.prev = None
self.next = None # 指針區域 , 雙向鏈表有兩個指針
- 雙向鏈表LIST
class DLinkedNodeList:
def __init__(self):
# 使用僞頭部和僞尾部節點(更方便不用循環遍歷出沒有next是尾部)
self.head = DLinkedNode()
self.tail = DLinkedNode()
# 首尾相鏈
self.head.next = self.tail
self.tail.prev = self.head
# 添加一個新元素在鏈表尾部
def add_to_tail(node):
# 新增的節點 前後指針賦值
node.prev = self.tail.prev
node.next = self.tail
# 因爲是雙線鏈表 新增位置的前一個節點的next 和後一節點的prev 也要鏈接上
self.tail.prev.next = node
self.tail.prev = node
# 添加一個新元素在鏈表頭部
def add_to_head(node):
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def remove(node):
# 移除: 只需把前後節點的 next,prev 指針跳過移除的元素 鏈接
node.next.prev =node.prev
node.prev.next = node.next