1. 程式人生 > >用 Python 實現單向連結串列

用 Python 實現單向連結串列

寫在前面

最近在看資料結構,看過才發現,只有這些東西才能讓我更加深刻的理解 python 中的資料型別。其實不管語言怎麼變化,資料結構和演算法是恆古不變的,這些東西學會,學一些別的語言會很快的。
我可能太菜了,一個連結串列看了好幾遍,手動捂臉,。

什麼是 連結串列

連結串列顧名思義就是~鏈
連結串列是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。連結串列中每一個元素成為“結點”,每一個結點都是由資料域和指標域組成的。跟陣列不同連結串列不用預先定義大小,而且硬體支援的話可以無限擴充套件。

用 python 的程式碼來實現

實現連結串列,本質上和語言是無關的。但是靈活度卻和實現它的語言密切相關。
用 python 實現起來相對起來簡單一點。
定義一個節點:

# 單鏈表的節點由資料域和指標域兩部分組成,通俗講就是一個存資料一個存下一個資料的地址。
class Node(object):
    '''節點'''
    def __init__(self,element):
        # 儲存節點的資料
        self.element = element 
        # 下一個節點的地址,因為現在還沒有建立連結串列,下一個節點指向還不確定,所以下一個節點的地址暫為空
        self.next = None 

節點建立完成之後,建立一個單向連結串列。

class SingleLinkList(object):
    '''實現單鏈表,把節點串聯起來'''
# 這裡實現一個物件的屬性,目的是把節點掛到連結串列的開始位置,後續節點就不會迷路啦 # 一開始節點預設為空 def __init__(self,node=None): self.__head = node def is_empty(self): '''判斷連結串列是否為空''' # 如果連結串列的頭部沒有節點,就為空 return self.__head == None def length(self): '''返回連結串列的長度''' # 要想知道連結串列的長度,需要遍歷一遍連結串列,然後計數
# 定義一個遊標,指向第一個節點,通過遊標的移動,計算連結串列中元素的個數 cur = self.__head # 代表遊標跟第一個節點指向的是同一個位置 count = 0 while cur != None: count += 1 cur = cur.next # 遊標移動 return count def travel(self): '''遍歷整個連結串列''' cur = self.__head while cur != None: print(cur.element,end=' ') cur = cur.next def add(self,item): '''在頭部新增元素''' # 在頭部新增,把原來的頭部節點斷開 # 新的節點的地址指向原來節點的第一個位置,然後新的節點的元素設為頭部 node = Node(item) node.next = self.__head self.__head = node def append(self,item): '''連結串列尾部新增元素,尾插法''' # 先構造這個節點 node = Node(item) if self.is_empty(): self.__head = node else: cur = self.__head # 這裡判斷條件發生變化,請注意 while cur.next != None: cur = cur.next cur.next = node def insert(self,pos,item): '''指定位置插入元素''' # 如果輸入的位置元素小於零,在頭部插入 if pos <= 0: self.add(item) # 如果輸入的位置元素大於列表的長度,在尾部插入 elif pos > (self.length()-1): self.append(item) else: node = Node(item) pre = self.__head count = 0 # 要對插入位置的前一個元素進行操作 while count < (pos - 1): pre = pre.next count += 1 # 當迴圈退出後,pre 指向 pos-1 的位置。 node.next = pre.next pre.next = node def remove(self,item): '''刪除節點''' cur = self.__head pre = None while cur != None: if cur.element == item: # 先判斷此節點是否是頭結點 if cur == self.__head: self.__head = cur.next else: pre.next = cur.next break else: pre = cur cur = cur.next def search(self,item): '''查詢節點是否存在''' cur = self.__head while cur != None: if cur.element == item: return True else: cur = cur.next return False if __name__ == '__main__': li = SingleLinkList() print('是否為空',li.is_empty()) print('長度是否為0',li.length()) li.append(1) print('是否為空',li.is_empty()) print('長度是否為0',li.length()) li.append(2) li.add(9) li.travel() li.insert(1,10) li.travel()