本文實例講述了Python數據結構與算法之鏈表定義與用法。分享給大家供大家參考,具體如下:
本文將為大家講解:
(1)從鏈表節點的定義開始,以類的方式,面向對象的思想進行鏈表的設計
(2)鏈表類插入和刪除等成員函數實現時需要考慮的邊界條件,
prepend(頭部插入)、pop(頭部刪除)、append(尾部插入)、pop_last(尾部刪除)
2.1 插入:
空鏈表
鏈表長度為1
插入到末尾
2.2 刪除
空鏈表
鏈表長度為1
刪除末尾元素
(3)從單鏈表到單鏈表的一眾變體:
帶尾節點的單鏈表
循環單鏈表
雙鏈表
1. 鏈表節點的定義
class LNode: def __init__(self, elem, next_=None): self.elem = elem self.next = next_
2. 單鏈表的實現
重點理解插入、刪除的實現及其需要考慮的邊界條件:
class LinkedListUnderflow(ValueError): passclass LList: def __init__(self): self._head = None def is_empty(self): return self._head is None def prepend(self, elem): self._head = LNode(elem, self._head) def pop(self): if self._head is None: raise LinkedListUnderflow('in pop') e = self._head.elem self._head = self._head.next return e def append(self, elem): if self._head is None: self._head = LNode(elem) return p = self._head while p.next is not None: p = p.next p.next = LNode(elem) def pop_last(self): if self._head is None: raise LinkedListUnderflow('in pop_last') p = self._head if p.next is None: e = p.elem self._head = None return e while p.next.next is not None: p = p.next e = p.next.elem p.next = None return e簡單總結:
(0)能夠訪問 p.next.next 的前提是 p.next 不為空;
(1)尾部插入,如果鏈表不為空,需且僅需改變的是尾部節點的指針;
(2)尾部刪除,如果鏈表長度不為空,需且僅需改變的是倒數第二個節點的指針。
單鏈表的簡單變形:具有尾部節點的單鏈表
class LList1(LList): def __init__(self): LList.__init__(self) self._rear = None ...
我們僅需重寫的是:頭部的插入、尾部的插入、尾部的刪除
def prepend(self, elem): if self._head is None: self._head = LNode(elem) self._rear = self._head else: self._head = LNode(elem, self._head)def append(self, elem): if self._head is None: self._head = LNode(elem) self._rear = self._head else: self._rear.next = LNode(elem) self._rear = self._rear.nextdef pop_last(self): if self._head is None: raise LinkedListUnderflow('in pop_last') p = self._head if p.next is None: e = p.elem self._head = None return e while p.next.next is not None: p = p.next e = p.next.elem self._rear = p p.next = None return e
新聞熱點
疑難解答