Python 實現單向鍊錶

2021-07-07 08:06:03 字數 4371 閱讀 3105

鍊錶顧名思義就是~鏈

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

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

陣列適用於獲取元素的操作,直接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

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兩個節點,就不用遞迴尋找尾節點了)

"""追加節點"""

def(self, data):

""" 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

找到當前節點賦值即可

"""設定節點"""

defset

(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

"""插入節點"""

definsert

(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即可

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

defdelete

(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

ifnot 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:

"""defreverse

(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)

將頭賦為空就好

"""清空鍊錶"""

defclear

(self):

self.head = none

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

git 路徑

作者 [@小王]

2015 年

Python 實現單向動態鍊錶

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

Python的單向鍊錶實現

思路 鍊錶由節點組成,先規定節點 node 包含data和指向下個節點的next 初始化data當然就是傳入的data了,next指向none 新增分兩種情況 鍊錶為空,那麼頭節點和尾節點都指向新插入的節點 鍊錶不為空,那麼直接在尾部新增即可 遍歷因為只有鍊錶的尾節點的next是指向none的,所以...

實現單向鍊錶

鍊錶類 public class link 增加節點 public void add node node else 輸出節點 public void print else 內部搜尋節點的方法 public boolean search string data 直到不存在下乙個節點結束搜尋 if th...