一、單向鏈表實現
在單向鏈表結構中,每個節點包含兩部分,元素部分和指針部分,其中元素部分即為節點的值,指針部分指向下一個節點或者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
單鏈表基本的增刪改查等功能已基本實現,但代碼還是有待改善優化