鍊錶顧名思義就是~鏈
鍊錶是一種動態資料結構,他的特點是用一組任意的儲存單元存放資料元素。鍊錶中每乙個元素成為「結點」,每乙個結點都是由資料域和指標域組成的。跟陣列不同鍊錶不用預先定義大小,而且硬體支援的話可以無限擴充套件。
陣列需要預先定義大小,無法適應資料動態地增減,資料小於定義的長度會浪費記憶體,資料超過預定義的長度無法插入。而鍊錶是動態增刪資料,可以隨意增加。
陣列適用於獲取元素的操作,直接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 圖示...