單向鍊錶:鍊錶之單向鍊錶
迴圈鍊錶是單向鍊錶的變化形式。單向鍊錶的尾部的指標域是空的,而迴圈鍊錶的尾部指標是指向鍊錶的頭結點的,其結構如圖一所示。
圖 一循
環鏈表結
構圖一 迴圈鍊錶結構
圖一迴圈鍊錶
結構從上面結構可以看出,迴圈鍊錶的節點形成了乙個圈。在進行遍歷時,可以從任意節點開始。如果記錄了尾部節點的話,迴圈鍊錶的操作會方便很多,比如,可以實現o(1)時間的表頭/表尾插入和o(1)時間的表頭刪除。
is_empty() 鍊錶是否為空
length() 鍊錶的長度
scan() 遍歷鍊錶的節點
add(item) 頭部新增節點
insert(position,item) 中間插入節點
remove(item)移除指定節點
search(item) 查詢是否存在包含該元素的節點
以下是以python實現的**
class
node
:"""建立節點"""
def__init__
(self, data)
: self.data = data
self.
next
=none
class
cyclelinkedlist
(object):
"""建立迴圈鍊錶"""
def__init__
(self, node=
none):
self.rear = node
if node is
notnone
: self.rear.
next
= node
defis_empty
(self)
:"""鍊錶是否為空"""
return self.rear ==
none
deflength
(self)
:"""鍊錶長度"""
if self.rear is
none
:return
0else
: count =
0 curnode = self.rear.
next
while curnode:
count +=
1 curnode = curnode.
next
if curnode == self.rear.
next
:return count
defadd(self, item)
:"""頭部插入"""
"""儲存了self.rear屬性,使的找到頭節點很方便"""
node = node(item)
if self.is_empty():
self.rear = node
self.rear.
next
= node
else
: node.
next
= self.rear.
next
self.rear.
next
= node
def(self, item)
:"""尾端插入"""
"""先執行前端插入,再執行尾部指標移動"""
self.add(item)
# 頭部插入
self.rear = self.rear.
next
# 將尾部指標移動到新新增的節點處
definsert
(self, index, item)
:""""索引是index,節點是第index+1個節點"""
if index <=0:
self.add(item)
elif index > self.length()-
1:else
: node = node(item)
curnode = self.rear.
next
# 找到頭節點
count =
0while count < index -1:
curnode = curnode.
next
count +=
1 node.
next
= curnode.
next
curnode.
next
= node
defremove
(self, item)
:"""移除節點"""
if self.is_empty():
return
else
: curnode = self.rear.
next
precurnode =
none
while curnode:
if curnode.data == item:
if curnode == self.rear.
next
:# 要刪除的是頭節點
self.rear.
next
= curnode.
next
else
: precurnode.
next
= curnode.
next
break
precurnode = curnode
curnode = curnode.
next
defscan
(self)
:"""遍歷鍊錶"""
if self.rear is
none
:return
curnode = self.rear.
next
# 通過尾部指標獲取頭節點
while curnode:
print
(curnode.data, end=
' ')
curnode = curnode.
next
if curnode == self.rear.
next
:return
defsearch
(self, item)
: curnode = self.rear.
next
while curnode:
if curnode.data == item:
return
true
curnode = curnode.
next
if curnode.
next
== self.rear.
next
:return
return
false
# 測試**
cl = cyclelinkedlist(
)cl.add(1)
2)3)
5)cl.insert(3,
4)cl.remove(5)
print
(cl.search(3)
)cl.scan(
)
執行結果如下:
從執行結果上看,**執行正常,如有不合適之處,敬請指正,謝謝。
鍊錶演算法四之迴圈鍊錶
前面介紹了單鏈表的一些練習題,本節介紹迴圈鍊錶,顧名思義,肯定得迴圈起來,就是表中的最後乙個結點的指標指向頭結點,使整個鍊錶形成乙個環。根據前面單鏈表中介紹的頭插法和尾插法,稍微思考一下,就知道再迴圈鍊錶中應該選擇用尾插法這種方式來建立迴圈鍊錶,因為尾插法每次都是在鍊錶的末尾插入新的元素。和原來的尾...
迴圈鍊錶,雙向鍊錶
迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...
迴圈鍊錶企業鍊錶
一 特點 讓鍊錶的最後乙個結點的next指標指向頭結點。初始化小節點時直接讓next指標指向鍊錶的頭結點。二 include include include 小結點 typedef struct listnode listnode 鍊錶結點 typedef struct circularlist c...