資料結構與演算法(五) 迴圈鍊錶 雙向迴圈鍊錶的實現

2021-10-05 04:08:28 字數 2553 閱讀 4684

資料結構與演算法(二):python 單向鍊錶及其排序

資料結構與演算法(三):python實現雙向鍊錶並遍歷

今天分別對單鏈表和雙向鍊錶新增迴圈,使之分別成為迴圈單鏈表迴圈雙向鍊錶

本次實現,均使用了哨兵結點,也即在建立鍊錶之前的初始化部分,已經自動建立了乙個內容為none的節點,這樣做的目的是為了在後續插入其他結點時,可以不用考慮原煉表為空的邊界條件。 

廢話少說,直接上碼:

class node(object):

def __init__(self, data, next=none):

self.data = data

self.next = next

class circlesinglylinkedlist(object):

def __init__(self):

"""初始化迴圈單鏈表時,建立了乙個哨兵結點,使得後續插入結點不用考慮邊界

"""self.headnode = node(none)

self.headnode.next = self.headnode

self.length = 0

def crt_from_list(self, l):

"""尾插法:每次在尾部插入乙個結點

"""h = self.headnode

for l in l:

h.next = node(l, next=self.headnode)

h = h.next

self.length += 1

def lineprint(self):

if self.headnode == self.headnode.next:

print("null")

return

p = self.headnode.next

print(p.data)

while p.next != self.headnode:

print(p.next.data)

p = p.next

if __name__ == "__main__":

cll = circlesinglylinkedlist()

cll.crt_from_list([0,'a',2])

print('迴圈單鏈表遍歷:')

cll.lineprint()

class binode(object):

"""雙向鍊錶的node類

"""def __init__(self, data, next=none, previous=none):

self.data = data

self.next = next

self.previous = previous

class circlebilinkedlist(object):

def __init__(self):

"""初始化時,建立乙個哨兵結點

"""self.headnode = binode(none)

self.headnode.next = self.headnode

self.headnode.previous = self.headnode

self.length = 0

def crtfromlist(self, l):

"""從乙個列表l建立乙個迴圈雙向鍊錶

"""h = self.headnode

for l in l:

h.next = binode(l, next=self.headnode, previous=h)

self.headnode.previous = h.next

h = h.next

def cbprint(self, mode = 'forward'):

"""迴圈雙向遍歷鍊錶

mode:遍歷方式,包括從前往後('forward'/0)、從後往前('backward'/1)

"""if mode == 'forward' or mode == 0:

p = self.headnode.next

while p != self.headnode:

print(p.data)

p = p.next

elif mode == 'backward' or mode == 1:

p = self.headnode.previous

while p != self.headnode:

print(p.data)

p = p.previous

if __name__ == "__main__":

print("迴圈雙向鍊錶遍歷:")

cb = circlebilinkedlist()

print("從前往後:")

cb.crtfromlist(['a','b','c'])

cb.cbprint(mode='forward')

print("從後往前:")

cb.cbprint(mode='backward')

資料結構 雙向迴圈鍊錶

近期我在學習資料結構,於是我自己整理了單鏈表 迴圈單鏈表 雙向鍊錶 雙向迴圈鍊錶的相關 以鞏固這段時間的學習,也希望能夠幫助初學者,希望大家在閱讀以下 時發現問題糾正於我,一起 cycdoublelist.h ifndef cycdoublelish h define cycdoublelish h...

資料結構 雙向迴圈鍊錶

typedef struct node node,pnode pnode init dc list void 雙向迴圈鍊錶的初始化 pnode new node int dat 新建乙個節點 把位址為pnew的節點插入到雙向迴圈鍊錶的尾部 頭節點的前面 bool list add tail pnod...

資料結構 雙向鍊錶,迴圈鍊錶

也許是自己太小看資料結構,練習了幾天還在第二章徘徊,可自己覺得基礎還是要打牢的好 總結一下 第乙個是雙向鍊錶,include include typedef struct node node,linklist void creat linklist l else int insert linklis...