1. 程式人生 > >單鏈表類的實現

單鏈表類的實現

一個普通的單鏈表(一個指標域),對於其最重要的就是單鏈表的頭指標,通過頭指標可以確定單鏈表的一些屬性,如:是不是空的,通過頭指標進行遍歷等。 我們用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語言的實現》,強推這本書!!!