Python 實現單向動態鍊錶

2021-08-26 05:48:22 字數 4189 閱讀 1954

鍊錶顧名思義就是~鏈

鍊錶是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。鍊錶中每乙個元素成為「結點」,每乙個結點都是由資料域和指標域組成的。跟陣列不同鍊錶不用預先定義大小,而且硬體支援的話可以無限擴充套件。

陣列需要預先定義大小,無法適應資料動態地增減,資料小於定義的長度會浪費記憶體,資料超過預定義的長度無法插入。而鍊錶是動態增刪資料,可以隨意增加。

陣列適用於獲取元素的操作,直接get索引即可,鍊錶對於獲取元素比較麻煩需要從頭一直尋找,但是適用與增刪,直接修改節點的指向即可,但是對於陣列就比較麻煩了,例如[1,2,3,4]需要在下標為1的位置插入-2,則需要將[2,3,4]後移,賦值ls[1]=-2

陣列從棧中分配空間, 對於程式設計師方便快速,但自由度小。鍊錶從堆中分配空間, 自由度大但申請管理比較麻煩.

"""節點類"""

class node(object):

def __init__(self, data):

self.data = data

self.nex = none

class linklist(object):

def __init__(self):

"""初始化鍊錶"""

self.head = none

def __len__(self):

pre = self.head

length = 0

while pre:

length += 1

pre = pre.nex

return length

追加節點還是比較簡單的,如果head節點不存在,則當前節點為head節點,否則的話找到尾節點,將尾節點的next指向當前節點(可以新增head和tail兩個節點,就不用遞迴尋找尾節點了)

"""追加節點"""

"""1.head 為none :head-->node

2.tail.nex-->node

:param data:

:return:

"""node = node(data)

if self.head is none:

self.head = node

else:

pre = self.head

while pre.nex:

pre = pre.nex

pre.nex = node

獲取節點也是比較容易的,無非就是判斷index值的正負

def get(self, index):

""":param index:

:return:

"""index = index if index >= 0 else len(self) + index

if len(self) < index or index < 0:

return none

pre = self.head

while index:

pre = pre.nex

index -= 1

return pre

找到當前節點賦值即可

"""設定節點"""

def set(self, index, data):

node = self.get(index)

if node:

node.data = data

return node

插入節點需要找到插入節點的前乙個節點pre_node(索引index的正負,前一節點不同,需要判斷一下),然後將pre_node.nex指向當前節點。同時將當前節點的nex指向pre_node.nex.nex

"""插入節點"""

def insert(self, index, data):

"""1.index 插入節點位置包括正負數

2.找到index-1-->pre_node的節點

3.pre_node.next-->node

node.next-->pre_node.next.next

4.head

:param index:

:param data:

:return:

"""node = node(data)

if abs(index + 1) > len(self):

return false

index = index if index >= 0 else len(self) + index + 1

if index == 0:

node.nex = self.head

self.head = node

else:

pre = self.get(index - 1)

if pre:

nex = pre.nex

pre.nex = node

node.nex = nex

else:

return false

return node

刪除節點,也要區分一下索引的正負。找到當前節點的前乙個節點pre_node和後乙個節點next_node,將pre_node.nex–>next_node即可

"""刪除某個元素"""

def delete(self, index):

f = index if index > 0 else abs(index + 1)

if len(self) <= f:

return false

pre = self.head

index = index if index >= 0 else len(self) + index

prep = none

while index:

prep = pre

pre = pre.nex

index -= 1

if not prep:

self.head = pre.nex

else:

prep.nex = pre.nex

return pre.data

反轉鍊錶的實現有多種方式,比較簡單的就是生成乙個新的鍊錶--》可以用陣列儲存所有節點讓後倒序生成新的鍊錶

在這裡用下面這種方式生產:

反轉鍊錶就是將node.nex–>pre_node 遞迴實現即可,然後讓tail賦值為head

"""反轉鍊錶"""

def __reversed__(self):

"""1.pre-->next 轉變為 next-->pre

2.pre 若是head 則把 pre.nex --> none

3.tail-->self.head

:return:

"""def reverse(pre_node, node):

if pre_node is self.head:

pre_node.nex = none

if node:

next_node = node.nex

node.nex = pre_node

return reverse(node, next_node)

else:

self.head = pre_node

return reverse(self.head, self.head.nex)

將頭賦為空就好

"""清空鍊錶"""

def clear(self):

self.head = none

下節將介紹雙向鍊錶的實現

git 路徑

其他關於單鏈表的csdn部落格

Python 實現單向鍊錶

鍊錶顧名思義就是 鏈 鍊錶是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。鍊錶中每乙個元素成為 結點 每乙個結點都是由資料域和指標域組成的。跟陣列不同鍊錶不用預先定義大小,而且硬體支援的話可以無限擴充套件。陣列需要預先定義大小,無法適應資料動態地增減,資料小於定義的長度會浪費記憶體,...

單向動態鍊錶

什麼是鍊錶 鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相比於線性表順序結構,操...

單向動態鍊錶

include include define ok 1 define error 0 define true 1 define false 0 typedef int status typedef int elemtype typedef struct lnode lnode,linklist 圖示...