一、概述
鍊錶(linked list)是一組資料項的集合,其中每個資料項都是乙個節點的一部分,每個節點還包含指向下乙個節點的鏈結。
根據結構的不同,鍊錶可以分為單向鍊錶、單向迴圈鍊錶、雙向鍊錶、雙向迴圈鍊錶等。其中,單向鍊錶和單向迴圈鍊錶的結構如下圖所示:
二、adt
這裡只考慮單向迴圈鍊錶adt,其他型別的鍊錶adt大同小異。單向迴圈鍊錶adt(抽象資料型別)一般提供以下介面:
① sincyclinkedlist() 建立單向迴圈鍊錶
② add(item) 向鍊錶中插入資料項
③ remove(item) 刪除鍊錶中的資料項
④ search(item) 在鍊錶中查詢資料項是否存在
⑤ empty() 判斷鍊錶是否為空
⑥ size() 返回鍊錶中資料項的個數
單向迴圈鍊錶操作的示意圖如下:
三、python實現
python的內建型別list底層是由c陣列實現的,list在功能上更接近c++的vector(因為可以動態調整陣列大小)。我們都知道,陣列是連續列表,鍊錶是鏈結列表,二者在概念和結構上完全不同,因此list不能用於實現鍊錶。
在c/c++中,通常採用「指標+結構體」來實現鍊錶;而在python中,則可以採用「引用+類」來實現鍊錶。在下面的**中,sincyclinkedlist類代表單向迴圈鍊錶,node類代表鍊錶中的乙個節點:
#執行結果:-*- coding: utf-8 -*-
class
node:
def__init__
(self, initdata):
self.
__data =initdata
self.
__next =none
defgetdata(self):
return self.__data
defgetnext(self):
return self.__next
defsetdata(self, newdata):
self.
__data =newdata
defsetnext(self, newnext):
self.
__next =newnext
class
sincyclinkedlist:
def__init__
(self):
self.head =node(none)
self.head.setnext(self.head)
defadd(self, item):
temp =node(item)
temp.setnext(self.head.getnext())
self.head.setnext(temp)
defremove(self, item):
prev =self.head
while prev.getnext() !=self.head:
cur =prev.getnext()
if cur.getdata() ==item:
prev.setnext(cur.getnext())
prev =prev.getnext()
defsearch(self, item):
cur =self.head.getnext()
while cur !=self.head:
if cur.getdata() ==item:
return
true
cur =cur.getnext()
return
false
defempty(self):
return self.head.getnext() ==self.head
defsize(self):
count =0
cur =self.head.getnext()
while cur !=self.head:
count += 1cur =cur.getnext()
return
count
if__name__ == '
__main__':
s =sincyclinkedlist()
print('
s.empty() == %s, s.size() == %s
' %(s.empty(), s.size()))
s.add(19)
s.add(86)
print('
s.empty() == %s, s.size() == %s
' %(s.empty(), s.size()))
print('
86 is%s in s
' % (''
if s.search(86) else
'not
',))
print('
4 is%s in s
' % (''
if s.search(4) else
'not
',))
print('
s.empty() == %s, s.size() == %s
' %(s.empty(), s.size()))
s.remove(19)
print('
s.empty() == %s, s.size() == %s
' % (s.empty(), s.size()))
s.empty() == true, s.size() ==0s.empty() == false, s.size() == 2
86 isins
4 is
notin
ss.empty() == false, s.size() == 2s.empty() == false, s.size() == 1
算分與資料結構 冒泡思想
冒泡思想的乙個特點是所有的操作都在原陣列中進行,不占用額外的空間。一 氣泡排序 public class bubblesort public static void main string args new bubblesort bubblesort array for int i 0 i 二 冒泡...
資料結構 Python實現
參考部落格 演算法和資料結構 一 棧和佇列 python資料結構 棧 佇列的實現 一 python資料結構 棧 佇列的實現 二 python資料結構 鍊錶的實現 資料結構 定義 簡單來說,資料結構就是設計資料以何種方式組織並儲存在計算機中。比如 列表 集合與字典等都是一種資料結構。ps 程式 資料結...
資料結構 Python實現
參考部落格 演算法和資料結構 一 棧和佇列 python資料結構 棧 佇列的實現 一 python資料結構 棧 佇列的實現 二 python資料結構 鍊錶的實現 資料結構 定義 簡單來說,資料結構就是設計資料以何種方式組織並儲存在計算機中。比如 列表 集合與字典等都是一種資料結構。ps 程式 資料結...