Python資料結構與演算法之連結串列定義與用法例項詳解【單連結串列、迴圈連結串列】

NO IMAGE

本文例項講述了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):
pass
class 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.next
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
self._rear = p
p.next = None
return e

單連結串列的變體:迴圈單連結串列


class LCList:
def __init__(self):
self._rear = None
def prepend(self, elem):
if self._rear is None:
self._rear = LNode(elem)
self._rear.next = self._rear
else:
self._rear.next = LNode(elem, self._rear.next)
def append(self, elem):
self.prepend(elem)
self_rear = self._rear.next
def pop(self):
if self._rear is None:
raise LinkedListUnderflow('in pop')
p = self._rear.next
if p is None:
self._rear = None
else:
self._rear.next = p.next
return p.elem
def printall(self):
if self._rear is None:
raise ...
p = self._rear.next
while True:
print(p.elem)
if p is self._rear:
break
p = p.next

更多關於Python相關內容可檢視本站專題:《Python資料結構與演算法教程》、《Python Socket程式設計技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總

希望本文所述對大家Python程式設計有所幫助。

您可能感興趣的文章:

python單連結串列實現程式碼例項Python單連結串列的簡單實現方法Python單連結串列簡單實現程式碼Python資料結構之單連結串列詳解單連結串列反轉python實現程式碼示例淺談Python單向連結串列的實現python資料結構連結串列之單向連結串列(例項講解)Python實現的單向迴圈連結串列功能示例Python資料結構與演算法之列表(連結串列,linked list)簡單實現python實現單向連結串列詳解Python實現針對給定單連結串列刪除指定節點的方法