日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python创建一个循环链表、双向循环链表

發布時間:2025/3/20 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python创建一个循环链表、双向循环链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

循環鏈表與雙向循環鏈表

循環鏈表

循環鏈表相較于單鏈表,將末尾結點的連接域指向了頭結點,就類似于將播放器的順序播放改成了列表循環

雙向循環鏈表

雙向鏈表相較于之前的鏈表多了上一節點連接域,在雙向鏈表中,游標的移動方向可以不只是單一的向后移動,還增加了向前移動的功能。

Python創建循環鏈表與雙向循環鏈表

計劃實現以下功能

  • is_empty() 鏈表是否為空
  • length() 鏈表長度
  • add(elem) 鏈表頭部添加元素
  • append(elem) 鏈表尾部添加元素
  • travel() 遍歷整個鏈表
  • position(pos)根據位置讀取指定元素
  • element(elem)輸出元素所在位置
  • search(elem) 查找節點是否存在
  • insert(pos, elem) 指定位置添加元素
  • del_add(self) 刪除首結點
  • del_app(self) 刪除尾結點
  • remove(elem) 指定元素刪除節點
  • delete(pos)根據位置刪除
  • clear()清空鏈表

Python制作

python實現循環鏈表

class Node:def __init__(self, elem):self.elem = elemself.next = Noneclass LoopLinked:def __init__(self, node=None):self.__head = nodeif node:node.next = self.__headdef is_empty(self):"""判斷鏈表是否為空"""# 判斷頭結點的值是否為空return self.__head is Nonedef length(self):"""判斷鏈表長度"""# 初始化游標cur = self.__head# 判斷是否為空if self.__head is None:return# 長度計算變量count = 1# 判斷游標指向是否為空while cur.next is not self.__head:# 指向下一個結點,同時計數器加一cur = cur.nextcount += 1return countdef add(self, elem):"""頭部添加元素"""# 創建新結點newNode = Node(elem)# 判斷是否為空鏈表if self.is_empty():self.__head = newNodenewNode.next = self.__headelse:# 創建游標cur = self.__head# 將原頭結點坐標給新結點,同時將新結點坐標給頭結點,再將尾結點指向新結點while cur.next != self.__head:cur = cur.nextnewNode.next, self.__head = self.__head, newNodecur.next = newNodedef append(self, elem):"""尾部添加元素"""# 新建結點newNode = Node(elem)# 判斷是否為空鏈表if self.is_empty():# 如果是空鏈表就將頭游標指向新結點self.__head = newNodenewNode.next = self.__headelse:# 初始化游標cur = self.__head# 將游標移動到末尾while cur.next is not self.__head:cur = cur.next# 將尾結點指向新結點,同時將新結點執行頭結點cur.next, newNode.next = newNode, self.__headdef travel(self):"""遍歷整個鏈表"""# 初始化游標cur = self.__head# 輸出每個結點的elemwhile cur.next is not self.__head:print(cur.elem, end=' ')cur = cur.nextprint(cur.elem)def insert(self, pos, elem):"""指定位置添加元素"""# 判斷插入位置if pos <= 0:self.add(elem)elif pos > (self.length() - 1):self.append(elem)else:# 新建結點newNode = Node(elem)# 創建游標cur = self.__head# 創建計數器count = 0# 將游標定位到指定位置前一位結點上while count < (pos - 1):count += 1cur = cur.next# 將游標位置的的next給新結點,將新結點的位置給游標newNode.next, cur.next = cur.next, newNodedef position(self, pos):"""根據位置讀取元素"""# 判斷輸入位置是否在鏈表中if 0 <= pos <= (self.length() - 1):# 創建游標cur = self.__head# 創建計數器count = 0# 將游標移動到指定位置while count < pos:count += 1cur = cur.nextreturn cur.elemelse:return Falsedef element(self, elem):"""輸出元素所在位置"""# 創建游標和計數器cur = self.__headcount = 0while True:# 判斷游標指向元素是否為輸入元素if cur.elem == elem:return count# 判斷測試的長度是否已經超出elif cur.next is self.__head:return Falsecur = cur.nextcount += 1def del_add(self):"""刪除首結點"""# 創建游標cur = self.__head# 將尾結點重新指向新的頭結點while cur.next != self.__head:cur = cur.next# 將首節點后移self.__head = self.__head.next# 讓尾結點指向新的首節點cur.next = self.__headdef del_app(self):"""刪除尾結點"""# 創建游標cur = self.__headpre = Nonewhile cur.next != self.__head:pre, cur = cur, cur.nextpre.next = self.__headdef remove(self, elem):"""根據指定元素刪除"""cur = self.__headpre = Nonewhile cur:# 判斷游標指向元素是否為輸入元素if cur.elem == elem:# 判斷是否刪除的為首節點if pre is None:self.del_add()return# 判斷是否刪除的為尾結點if cur.next is self.__head:self.del_app()returnelse:pre.next = cur.nextbreakelif cur.next == self.__head:return# 游標后移else:pre, cur = cur, cur.nextdef delete(self, pos):"""根據位置刪除"""# 創建游標以及副游標cur = self.__headpre = None# 判斷輸入是否在鏈表中if 0 <= pos <= (self.length() - 1):# 判斷是否為首結點if pos == 0:self.del_add()return# 判斷是否為尾結點elif pos == self.length():self.del_app()returnelse:count = 0while count < pos:count += 1pre, cur = cur, cur.nextpre.next = cur.nextdef clear(self):"""清空鏈表"""self.__head = None

雙向循環鏈表

結點

class DoubleNode:def __init__(self, elem):self.elem = elemself.next = Noneself.prev = None

我們將雙向循環鏈表和循環鏈表對比,如有相同的就不在重復編寫。
雙向結點和單向結點主要在添加和刪除結點的時候有所不同。

添加元素

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Linked:def __init__(self, node=None):self.__head = nodeif node:node.next = nodenode.prev = nodedef add(self, elem):"""頭部添加元素"""# 創建新結點newNode = DoubleNode(elem)# 判斷是否為空鏈表if self.is_empty():self.__head = newNodenewNode.prev, newNode.next = self.__head, self.__headelse:# 將新結點指向原頭結點newNode.next = self.__head# 將尾結點指向新結點self.__head.prev.next = newNode# 將新結點指向尾結點newNode.prev = self.__head.prev# 將原頭結點指向新結點self.__head.prev = newNode# 將原頭結點定義為新結點self.__head = newNodedef append(self, elem):"""尾部添加元素"""# 新建結點newNode = DoubleNode(elem)# 判斷是否為空鏈表if self.is_empty():self.__head = newNodenewNode.prev, newNode.next = self.__head, self.__headelse:# 將原尾結點指向新結點self.__head.prev.next = newNode# 將新結點指向原尾結點newNode.prev = self.__head.prev# 將尾結點指向頭結點newNode.next = self.__head# 將頭結點指向尾結點self.__head.prev = newNodedef insert(self, pos, elem):"""指定位置添加元素"""# 判斷插入位置if pos <= 0:self.add(elem)elif pos > (self.length() - 1):self.append(elem)else:# 新建結點newNode = DoubleNode(elem)# 創建游標以及副游標cur = self.__head# 創建計數器count = 0# 將游標定位到指定位置前一位結點上while count < (pos - 1):count += 1cur = cur.next# 將新結點指向游標以及游標之后的結點newNode.prev, newNode.next = cur, cur.next# 將游標所在結點之后的結點指向新結點cur.next.prev = newNode# 將指針所在結點指向新結點cur.next = newNode

刪除元素

def del_add(self):"""刪除首結點"""# 創建指向尾結點的游標cur = self.__head.prev# 將頭結點后移一位self.__head = self.__head.next# 將尾結點指向新的頭結點cur.next = self.__head# 將新的頭結點執行尾結點self.__head.prev = self.__headdef del_app(self):"""刪除尾結點"""# 創建游標并且指向尾結點cur = self.__head.prev# 將游標前移一位cur = cur.prev# 將游標所在結點指向頭結點cur.next = self.__head# 將頭結點指向游標所在位置self.__head.prev = curdef remove(self, elem):"""根據指定元素刪除"""cur = self.__headwhile cur:# 判斷游標指向元素是否為輸入元素if cur.elem == elem:# 判斷是否刪除的為首節點if self.__head.elem == elem:self.del_add()return# 判斷是否刪除的為尾結點if cur.next is self.__head:self.del_app()returnelse:cur.next.prev = cur.prevcur.prev.next = cur.nextbreakelif cur.next == self.__head:return# 游標后移else:cur = cur.nextdef delete(self, pos):"""根據位置刪除"""# 判斷輸入是否在鏈表中if 0 <= pos <= (self.length() - 1):# 判斷是否為首結點if pos == 0:self.del_add()return# 判斷是否為尾結點elif pos == self.length():self.del_app()returnelse:# 創建游標以及計數器cur = self.__headcount = 0while count < pos:count += 1cur = cur.nextcur.next.prev = cur.prevcur.prev.next = cur.next

總結

以上是生活随笔為你收集整理的Python创建一个循环链表、双向循环链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。