1. 程式人生 > 實用技巧 >Python 雙向連結串列的實現

Python 雙向連結串列的實現

概念:什麼是雙向連結串列

雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。

所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈連結串列

程式碼簡單實現:

"""
author: zhao xian xin

不積跬步無以至千里

"""

#定義雙向連結串列 每一個結點
class Node(object):

    def __init__(self, item):
        self.previous = None
        self.item = item
        self.next 
= None # 定義連結串列 class TwoWayLinkList(): """ 連結串列基本屬性 """ def __init__(self): self.hearder = None self.length = 0 """ 頭部插入 """ def firstAdd(self, node): if self.hearder == None: self.hearder = node else: node.next = self.hearder self.hearder.previous
= node self.hearder = node self.length += 1 """ 尾部插入 """ def tailAdd(self, node): if self.length == 0: self.firstAdd(node) else: currentNode = self.hearder for i in range(self.length - 1): currentNode = currentNode.next node.previous
= currentNode currentNode.next = node self.length += 1 """ 根據指定索引 插入 對應結點 """ def indexInsert(self, index, node): assert index != 0 or index <= self.length, "超出索引" if index == 1: self.firstAdd(node) elif index == 2: node.next = self.hearder.next node.prevopus = self.hearder self.hearder.next = node self.length += 1 elif index > self.length: self.tailAdd(node) else: currentNode = self.hearder for i in range(1, index - 1): currentNode = currentNode.next node.prevopus = currentNode node.next = currentNode.next currentNode.next.previous = node currentNode.next = node self.length += 1 """ 根據指定位置 刪除 結點""" def delNode(self, index): """ 判斷刪除的索引是否在標準範圍之中 """ assert index != 0 or index <= self.length, "超出索引" if index == 1: self.hearder = self.hearder.next self.hearder.previous = None elif index == 2: self.hearder.next = self.hearder.next.next self.hearder.next.next.previous = self.hearder else: currentNode = self.hearder for i in range(1, index - 1): currentNode = currentNode.next currentNode.next = currentNode.next.next self.length -= 1 """ 遍歷節點""" def rangeNode(self): assert self.length != 0 , "連結串列為空" currentNode = self.hearder for i in range(self.length): element = currentNode.item currentNode = currentNode.next print(element, end=" ") """ 結點之間的排序 不許改變指標位置, 只需改變連結串列中元素位置 """ def sortNode(self): pass """ 快速排序 """ for i in range(self.length): currentNode = self.hearder for j in range(0, self.length - i - 1): if currentNode.item > currentNode.next.item: mid = currentNode.item currentNode.item = currentNode.next.item currentNode.next.item = mid """ 別忘記 交換節點 """ currentNode = currentNode.next if __name__ == "__main__": node = Node(2) t = TwoWayLinkList() t.firstAdd(node) print(t.rangeNode()) """ 尾部 插入元素 """ t.tailAdd(Node(1)) t.tailAdd(Node(4)) print(t.rangeNode()) """ 頭部插入位置 """ t.firstAdd(Node(3)) print(t.rangeNode()) """ 根據索引插入對應的位置 """ t.indexInsert(6, Node(5)) print(t.rangeNode()) """ 根據指定位置 刪除節點 """ t.delNode(4) print(t.rangeNode()) """ 節點之間的 排序 """ t.sortNode() print("======排序======") print(t.rangeNode())