單鏈表的缺點:尾端加入元素操作的效率低,因為這時只能從表頭開始查詢,直至找到表的最後乙個結點,而後才能鏈結新結點
迴圈單鏈表: 最後乙個結點的next域不用none,而是指向表的最後乙個結點
實現迴圈單鏈表,採用b), 這樣可以同時支援o(1)時間的表頭/表尾插入和o(1)時間的表頭刪除,哪個結點算是表頭或表尾,主要是概念問題,從表的內部形態上無法區分
這種表物件只需要乙個資料域_rear, 它在邏輯上始終引用這錶的尾結點,前端加入結點,就是在尾端結點和首結點之間加入新的首結點,尾結點引用不變
尾端加入結點在原尾結點之後插入新結點,只是插入後要把它作為新的尾結點,因此需要更新尾結點引用
上面這兩個操作都要考慮空表插入的特殊情況
class
node
:def
__init__
(self, elem)
: self.elem = elem
self.pnext =
none
def__repr__
(self)
:# 這個函式將內容『友好』地顯示出來,否則會顯示物件的記憶體位址
return
str(self.elem)
class
lclist
:def
__init__
(self)
: self.rear =
none
defis_empty
(self)
:"""
判斷該鍊錶是否為空
:return: boolean
"""return self.rear ==
none
defprepend
(self, elem)
:# 前端插入
p = node(elem)
if self.rear is
none
: p.pnext = p # 建立乙個結點的環
self.rear = p
else
: p.pnext = self.rear.pnext
self.rear.pnext = p
def(self, elem)
:# 尾端插入
self.prepend(elem)
self.rear = self.rear.pnext
defpop_start
(self)
:# 前端彈出
if self.rear is
none
:print
("the list is none."
)return
p = self.rear.pnext
if self.rear is p:
# 如果只有乙個元素
self.rear =
none
else
: self.rear.pnext = p.pnext # 令rear的指標等於第二個元素的位址
return p.elem
defprintall
(self)
:if self.is_empty():
return
p = self.rear.pnext
print
("head"
, end=
' ')
while
true
:print
("-->"
, p.elem, end=
' ')
if p is self.rear:
break
p = p.pnext
print
("--> none. linked node finished"
)if __name__ ==
'__main__'
: node1 = node(elem=
'node1'
) node2 = node(elem=
'node2'
) lclist = lclist(
) lclist.printall(
)print
(lclist.pop_start())
lclist.printall(
)
e2)
lclist.printall()
print(lclist.pop_start())
lclist.printall()
迴圈單鏈表
include include include include define random x rand x typedef int status typedef int elemtype typedef struct lnode lnode typedef struct linklist link...
迴圈單鏈表
include includetypedef struct node snode snode creat 建立頭結點 t next head 和迴圈雙向鍊錶一樣 在這改就行了 return head int lenth snode l 求鍊錶的長度 return len snode get snod...
迴圈單鏈表
資料結構中迴圈單鏈表的簡單實現以及一些簡單操作的測試。迴圈單鏈表的簡單實現 include include define elemtype char define maxsize 50 using namespace std 定義結構 typedef struct listnode linklist...