單鏈錶類的實現

2021-08-28 11:01:18 字數 3074 閱讀 9345

乙個普通的單鏈表(乙個指標域),對於其最重要的就是單鏈表的頭指標,通過頭指標可以確定單鏈表的一些屬性,如:是不是空的,通過頭指標進行遍歷等。

我們用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會自動**

# 其儲存空間的

# 接下來是尾部插入

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

這就是乙個鍊錶類的實現。

如果深入理解鍊錶的實現的話,可以看出self._head是頭節點,但不是第乙個節點,它本身是乙個只包含指標域的鍊錶物件,而這個指標就是指向鍊錶的第乙個節點。

對於更複雜的鍊錶物件來說,我們還可以儲存鍊錶的長度,鍊錶的尾指標等,這就需要為鍊錶物件設計乙個資料結構(乙個類)

`我在網上盜了一張圖,用以說明單鏈表的結構

由圖可以看出,first就是頭指標,它不是乙個節點,而是存在有第乙個節點引用的「結構」吧!

所以我們叫first為鍊錶物件,其實它不止可以儲存第乙個節點的引用,還以儲存鍊錶的長度,尾節點的引用或者都包含。如果我們需要有鍊錶的長度的話,可以定義乙個鍊錶物件的類

class listobj:

def __init__(self):

self.node_num = 0

self.head = none

這樣我們手動加入節點數目的**就行了

完整**

迴圈鍊錶本質上只是列表物件的結構不一樣,

class cirlistobj:

def __init__(self):

self.head = none

self.nodenum = 0

self.rear = node

至於雙向鍊錶呢,只是節點的結構不一樣:

class doulnode:

def __init__(self, elem, prev = none, next = none):

self.prev = prev

self.elem = elem

self.next = next

上面兩種的具體實現,後面!

參考《資料結構與演算法 python語言的實現》,強推這本書!!!

單鏈表的實現類1

package singlelist imp public class link public void display link package singlelist imp public class linklist public boolean empty 為了插入新結點,只需要使新建立的結點...

DS單鏈表 類實現

用c 語言和類實現單鏈表,含頭結點 屬性包括 data資料域 next指標域 操作包括 插入 刪除 查詢 注意 單鏈表不是陣列,所以位置從1開始對應首結點,頭結點不放資料 n 第1行先輸入n表示有n個資料,接著輸入n個資料 第2行輸入要插入的位置和新資料 第3行輸入要插入的位置和新資料 第4行輸入要...

實現異質單鏈錶類

大學人員分為兩類,大學人員分為兩類,一類是教學人員,一類是非教學人員。這兩類人員的資訊管理系統中一部分資訊內容不同,另一部分資訊內容相同。設教學人員的資訊包括姓名 年齡和專業編號 非教學人員的資訊包括姓名 年齡和業績評定。現邀請設計乙個能同時儲存學習教學人員和非教學人員的異質單鏈錶類。include...