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