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