1. 程式人生 > >Python的單鏈表實現

Python的單鏈表實現

一、單向連結串列實現

在單向連結串列結構中,每個節點包含兩部分,元素部分和指標部分,其中元素部分即為節點的值,指標部分指向下一個節點或者None,另外,為了找到第一個節點,需要定義一個頭結點head,它只含有指標,即指向頭元素或者None 。

 

 

 

類似於陣列具有的增刪查改等功能,我們希望單向連結串列具備這些基本功能,接下來開始自定義單向連結串列的基本功能。

 

 

 

 

 

"""定義節點"""
class Node():
    def __init__(self, item):
        self.item 
= item self.next = None """定義單向連結串列""" class SingleList(): """將頭指標設為連結串列的私有屬性""" def __init__(self, node=None): self.__head = node """判斷是否為空""" def is_Empty(self): return self.__head == None """ 連結串列長度,通過遍歷獲得 需要考慮特殊情況:連結串列為空時是否能夠正確執行 """ def
get_length(self): cur = self.__head count = 0 while cur != None: count += 1 cur = cur.next return count def traver(self): cur = self.__head while cur != None: print(cur.item, end=" ") cur = cur.next
print() """ 頭部新增元素 需要考慮特殊情況:連結串列為空時是否能夠正確執行 """ def addFirst(self, item): node = Node(item) node.next = self.__head self.__head = node """ 尾部新增元素,首先需要遍歷找到最後一個元素 需要考慮特殊情況:連結串列為空時是否能夠正確執行 """ def addLast(self, item): node = Node(item) cur = self.__head if cur == None: self.__head = node else: while cur.next != None: cur = cur.next cur.next = node """ 在指定位置新增元素,先找到新增的位置 需要考慮特殊情況:在頭部和尾部以及為空時能否正確執行 """ def insert(self, index, item): if index <= 0: self.addFirst(item) elif index >= self.get_length(): self.addLast(item) else: node = Node(item) cur = self.__head count = 1 while count < index: cur = cur.next count += 1 node.next = cur.next cur.next = node """ 查詢元素 注意連結串列為空的特殊情況 """ def find(self, item): if self.is_Empty(): print("連結串列為空,無法查詢") return cur = self.__head i = 0 while cur.next != None and not cur.item == item: cur = cur.next i += 1 if cur.item == item: return("找到了,元素%s在%d處" %(item, i)) else: return("沒找到") """ 刪除指定位置元素 """ def remove(self, index): if self.is_Empty(): print("連結串列為空,無法刪除") return if index < 0 or index > self.get_length(): print("索引越界,請檢查!") return cur = self.__head pre = None count = 0 if index == 0: self.__head = cur.next return else: while count != index: pre = cur cur = pre.next count += 1 pre.next = cur.next return if __name__ == "__main__": sl = SingleList() print(sl.is_Empty()) sl.find(7) sl.insert(0,9) sl.traver() sl.addFirst(1) sl.traver() sl.addLast(2) sl.addLast(3) sl.addLast(4) sl.addLast(5) sl.addLast(6) sl.traver() sl.insert(-2, 21) sl.traver() sl.insert(20, 25) sl.traver() sl.insert(0, 15) sl.traver() sl.insert(2, 17) sl.traver() print(sl.find(7)) print(sl.find(6)) sl.remove(3) sl.traver() sl.remove(0) sl.traver() sl.remove(-1) sl.traver() sl.remove(20) sl.traver()

 

測試結果為:

True
連結串列為空,無法查詢
9
1 9
1 9 2 3 4 5 6
21 1 9 2 3 4 5 6
21 1 9 2 3 4 5 6 25
15 21 1 9 2 3 4 5 6 25
15 21 17 1 9 2 3 4 5 6 25
沒找到
找到了,元素6在9處
15 21 17 9 2 3 4 5 6 25
21 17 9 2 3 4 5 6 25
索引越界,請檢查!
21 17 9 2 3 4 5 6 25
索引越界,請檢查!
21 17 9 2 3 4 5 6 25

單鏈表基本的增刪改查等功能已基本實現,但程式碼還是有待改善優化