單鏈表類的實現
阿新 • • 發佈:2018-12-12
一個普通的單鏈表(一個指標域),對於其最重要的就是單鏈表的頭指標,通過頭指標可以確定單鏈表的一些屬性,如:是不是空的,通過頭指標進行遍歷等。 我們用python做一個單鏈表的類實現,要求可以建立一個空的單鏈表,還要能夠實現一些單鏈表的基本操作,如判斷是不是空的,頭部尾部插入,刪除,遍歷等 首先就是定於一個連結串列節點的類:
class LNode: def __init(self, elem, next = None): self.elem = elem self.next_ = next # 定義一個空的錯誤類,必須繼承自基礎的錯誤類 class LListValueError(ValueError): pass
接下來建立連結串列的類:
class LList: def __init__(self): self._head = None # 那麼初始化連結串列類就是建立了一個空連結串列 # 首先是一個判斷空的方法 def is_empty(self): return self._head == None # 接下來用於在頭部插入一個節點 def prepend(self, elem): self._head = LNode(elem, self._head) # 這是最簡單的實現方法 # 一個頭部刪除的方法 # 注意刪除,我們不能刪除一個空連結串列,那麼就需要使用定義的錯誤類 def pop_first(self): if not self._head: raise LListValueError(“wrong”) e = self._head.elem self._head = self._head.next return e # 直接將頭指標指向下一個節點,拋棄原頭節點,python會自動回收 # 其儲存空間的 # 接下來是尾部插入 def append(self, elem): p = self._head while p: if not p.next_: p.next_ = LNode(elem) return p = p.next self._head = LNode(elem) # 這裡有兩種情況,一種是空表,這是直接等於就可以了 # 其他的遍歷到最後一個元素,然後將他的next指標指向這個新建的元素 # 這裡有個變數p,我們稱之為掃描指標。 # 對於尾部刪除,有三種情況:空表,一個元素,兩個及以上的元素 def pop_last(self): if not self._head: raise LListValueError("wrong") if not self._head.next: self._head = None p = self._head while p.next.next: p = p.next e = p.next.elem p.next = None return e # 最後關於表的遍歷問題,我們對於表的遍歷問題 # 對於這種彙集物件來說,對其中的各個物件進行一些操作是很常見的, # 我們除了可以從頭指標順著找下去之外,還有一些是對特定元素進行的操作 # 主要實現後者 def for_each(self, operate): p = self._head while p: operate(p.elem) p = p.next # 其實還有一個就是關於python迭代器的,python的主要迭代工具就是迭代器 # 用yield關鍵字生成一個生成器函式是一個很好的選擇 def elements(self): p = self._head while p: yield p.elem p = p.next
這就是一個連結串列類的實現。 參考《資料結構與演算法 python語言的實現》,強推這本書!!!