雙向迴圈鍊錶的實現

2021-08-28 11:45:41 字數 3578 閱讀 9464

其實雙向迴圈鍊錶與單鏈表的區別在於每個節點的結構發生了改變,具體的說是,每個節點多了乙個指標域,用於指向上乙個節點。其他的如鍊錶物件就不需要進行改變了。

新的節點類:

class lnode:

def __init__(self, elem=0, prev=none, next_=none):

self.prev = prev

self.elem = elem

self.next = next_

實現**大同小異:

# 節點物件

class lnode:

def __init__(self, elem=0, prev=none, next_=none):

self.prev = prev

self.elem = elem

self.next = next_ # 加個下劃線,為了區分python中的next關鍵字

class listobj:

def __init__(self):

self.rear = none

self.nodenum = 0

# 接下來是乙個鍊錶類的實現(意思是:支援鍊錶的一些特定的操作)

class linkedlistundeflow(valueerror):

pass

# 我們要知道,對於雙鏈表的迴圈結構,我們要做的就是

# 將鍊錶的第乙個節點的prev域指向表尾,鍊錶的最後乙個域的nex域指向表首

class llist:

# 建立乙個空表

def __init__(self):

self.kerear = listobj()

self.head = none

# 初始化乙個鍊錶物件,該鍊錶物件儲存有鍊錶的節點數和鍊錶第乙個節點的引用

# head就是乙個鍊錶例項的屬性

# 判斷鍊錶是不是空,直接判斷鍊錶的表頭是不是空就行了

def isempty(self):

return self.head is none

# 接下來就是對元素的新增

def prepend(self, elem): # 表頭插入

if not self.head:

self.head = lnode(elem, self.kerear.rear, self.head)

self.kerear.rear = self.head

# 建立乙個迴圈,

else:

self.head = lnode(elem, self.kerear.rear, self.head)

self.kerear.nodenum += 1

if not self.head:

self.head = lnode(elem, self.kerear.rear, self.head)

self.kerear.rear = self.head

else:

self.kerear.rear.next = lnode(elem, self.kerear.rear, self.head)

self.kerear.rear = self.kerear.rear.next

self.kerear.nodenum += 1

def popfirst(self): # 表頭刪除,要求返回刪除元素

if not self.head:

raise linkedlistundeflow("空表不可刪除")

e = self.head.elem

self.head.next.prev = self.kerear.rear

self.head = self.head.next

self.kerear.nodenum -= 1

return e

def poplast(self): # 表尾刪除

if not self.head:

raise linkedlistundeflow("空表不可刪除")

if not self.head.next:

e = self.head.elem

self.head = self.kerear.rear

self.kerear.nodenum = 0

return e

# 如果是有兩個及以上的元素,那麼將倒數第二個元素的next指向none就可以了

# 所以要緊的是找到倒數第二個元素

e = self.kerear.rear.elem

self.kerear.rear.prev.next = self.head

self.kerear.rear = self.kerear.rear.prev

self.kerear.nodenum -= 1

return e

def printall(self):

# 這個遍歷從頭開始遍歷的

# 是乙個空鍊錶,乙個元素的鍊錶,多個元素的鍊錶

p = self.head

while p:

print(p.elem, end = '')

print(',', end = '')

if p.next == self.head:

break

p = p.next

print("\n")

## def element(self):

# p = self.kerear.head

# while p:

# yield p.elem

# p = p.next

# # 利用生成器函式,生成乙個迭代器(python中進行便利的工具)

mlist1 = llist() # 乙個空的鍊錶物件

print(mlist1.isempty())

for i in range(10):

# 從首部加入是個元素

mlist1.prepend(i)

print(mlist1.kerear.nodenum, "節點數", sep='--')

mlist1.printall()

# 看看首部加入是否成功

for i in range(10, 20):

print(mlist1.kerear.nodenum, "節點數", sep='--')

mlist1.printall()

# 看看尾部加入是否成功

print(mlist1.popfirst(),"首部刪除返回的", sep = '--')

print(mlist1.kerear.nodenum, "節點數", sep='--')

mlist1.printall()

# 看看首部刪除是否成功

print(mlist1.poplast(), "尾部刪除節點", sep='--')

print(mlist1.kerear.nodenum, "節點數", sep='--')

mlist1.printall()

# 看看尾部刪除是否成功

# for i in mlist1.element():

# print(i)

下一章會對鍊錶進行一些總結。

雙向迴圈鍊錶的實現

雙向迴圈鍊錶的實現 收藏我要投稿 在使用鍊錶來解決約瑟夫問題的時候,用到了迴圈鍊錶。迴圈鍊錶又分為單向迴圈鍊錶與雙向迴圈鍊錶,約瑟夫問題採用單項迴圈鍊錶可以得到很好的而解決了,但是單向鍊錶的很大的缺陷仍然存在,那就是在刪除的時候需要兩個併排指標同步移動。雙向鍊錶就可以解決這個問題,因為在雙向鍊錶中的...

雙向迴圈鍊錶 java實現

雙向迴圈煉表示意圖 雙向迴圈鍊錶實現 public class doublelink private int size 鍊錶長度 public nodehead 頭節點 constructor public doublelink 獲取鍊錶的長度 return public int size 判斷鍊錶...

C 實現雙向迴圈鍊錶

雙向迴圈鍊錶 除錯正常,所有功能均測試 節點類 template class listnode listnode type d,listnode n nullptr,listnode p nullptr data d next n prev p void setdata type d 雙向迴圈鍊錶 ...