用python實現單向鏈表
阿新 • • 發佈:2019-03-09
單鏈表的實現 lse height 就是 單向鏈表 img 定位 ise image
單向鏈表
單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最後一個節點的鏈接域則指向一個空值。
- 表元素域elem用來存放具體的數據。
- 鏈接域next用來存放下一個節點的位置(python中的標識)
- 變量p指向鏈表的頭節點(首節點)的位置,從p出發能找到表中的任意節點。
節點的實現
class SingleNode(object): """單鏈表的節點""" def __init__(self, item):# item存放數據元素 self.item = item # next是下一個節點的標識 self.next = None
測試
# 創建兩個節點 s1 = SingleNode(10) s2 = SingleNode(12) # 將節點2綁定到節點1的next屬性上 s1.next = s2 print(‘s1:‘, s1.item) # s1: 10 print(‘s2:‘, s1.next.item) # s2: 12
單鏈表的操作
- is_empty() 鏈表是否為空
- length() 鏈表長度
- travel() 遍歷整個鏈表
- add(item) 鏈表頭部添加元素
- append(item) 鏈表尾部添加元素
- insert(pos, item) 指定位置添加元素
- remove(item) 刪除節點
- search(item) 查找節點是否存在
單鏈表的實現
class SingleLinkList(object): """單鏈表""" def __init__(self): self.head = None def is_empty(self): """判斷鏈表是否為空""" returnself.head is None def length(self): """計算鏈表長度""" # cur初始時指向頭節點 cur = self.head count = 0 # cur指向None,說明到達了尾節點 while cur is not None: count += 1 cur = cur.next return count
遍歷鏈表
def travel(self): """遍歷鏈表""" cur = self.head while cur is not None: print(cur.item) cur = cur.next
頭部添加元素
def add(self, item): """頭部添加元素""" # 創建一個保存item值的節點 node = SingleNode(item) # 將新節點的鏈接域指向頭節點 node.next = self.head # 將鏈表的頭head指向新節點 self.head = node
尾部追加元素
def append(self, item): """尾部追加元素""" # 創建一個保存item值的節點 node = SingleNode(item) # 先判斷鏈表是否為空,若是空鏈表,則將head指向新節點 if self.is_empty(): self.head = node # 若不為空,則找到尾部,將尾節點的next指向新節點 else: cur = self.head # 遍歷鏈表,找到最後一個節點 while cur.next is not None: cur = cur.next cur.next = node
在指定位置添加元素
def insert(self, pos, item): """在指定位置添加元素""" # 如果指定位置pos在第一個元素之前,則執行頭部插入 if pos <= 0: self.add(item) # 如果指定元素超過鏈表尾部,則執行尾部插入 elif pos > (self.length()-1): self.append(item) # 中間位置插入 else: node = SingleNode(item) # pre_node用來指向指定位置pos的前一個節點pos-1,從頭節點開始移動到指定位置 pre_node = self.head num = 0 while num < pos - 1: num += 1 pre_node = pre_node.next # 把新節點的鏈接域指向插入的下一個節點 node.next = pre_node.next # 把插入的前一個節點的鏈接域指向新節點 pre_node.next = node
刪除元素
def remove(self, item): """刪除節點""" cur = self.head pre = None while cur is not None: # 找到了指定元素 if cur.item == item: # 如果第一個就是刪除的節點 if not pre: # 將頭指針指向頭節點的後一個節點 self.head = cur.next else: # 將刪除位置的前一個節點的next指向刪除位置的後一個節點 pre.next = cur.next return else: # 繼續按鏈表後移節點 pre = cur cur = cur.next else: raise ValueError(‘Can not find the item!‘)
查找節點是否存在
def search(self, item): """鏈表查找節點是否存在,並返回true或者false""" cur = self.head while cur is not None: if cur.item == item: return True cur = cur.next return False
測試
if __name__ == ‘__main__‘: lst1 = SingleLinkList() lst1.append(1) lst1.append(‘a‘) lst1.add(0) lst1.insert(2, ‘h‘) print(‘length:‘, lst1.length()) # length: 4 lst1.travel() # 0 1 h a lst1.remove(1) lst1.remove(‘h‘) print(‘length:‘, lst1.length()) # 2 lst1.travel() # 0 a print(lst1.is_empty()) # False
用python實現單向鏈表