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

歡迎訪問 生活随笔!

生活随笔

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

python

python算法与数据结构-循环链表

發布時間:2024/9/20 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python算法与数据结构-循环链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

求鏈表長度

需要考慮的特殊情況,空鏈表或者鏈表當中只有一個節點的時候。

添加元素:

除了頭部指向新節點,單向循環鏈表也需要尾節點指向新的節點

刪除元素如下所示:

代碼如下所示:

# -*-coding=utf-8-*- class Node(object):"""單鏈表的節點"""def __init__(self, elem):# item存放數據元素self.elem = elem# next是下一個節點的標識self.next = Noneclass SingleCycleLinkList(object):"""單鏈表"""# head是頭節點屬性,_head在Python中加兩個下劃線就是私有屬性# 這個node是用戶傳進來的def __init__(self, node=None):self.__head = nodeif node:node.next = nodedef is_empty(self):"""判斷是否為空"""return self.__head==Nonedef length(self):"""鏈表長度"""if self.is_empty():return 0# cur游標,用來移動遍歷節點cur = self.__head# count 記錄數量count = 1# 尾節點指向self.__head表示循環了一次,當未循環一次未到達尾部時while cur.next != self.__head:count += 1# 將cur后移一個節點cur = cur.nextreturn countdef travel(self):"""遍歷整個鏈表"""#空鏈表打印if self.is_empty():returncur = self.__headwhile cur.next != self.__head:#添加這個這個,后期打印就不換行了print(cur.elem,end=" ")cur = cur.next#退出循環,cur指向尾節點,但尾結點的元素未打印print(cur.elem)# passdef append(self, item):"""鏈表尾部添加元素,尾插法"""node = Node(item)# 這個if條件是空鏈表的意思,我們需要考慮特殊條件# 先判斷鏈表是否為空,若是空鏈表,則將_head指向新節點if self.is_empty():self.__head = nodenode.next = node# 若不為空,則找到尾部,將尾節點的next指向新節點else:cur = self.__headwhile cur.next != self.__head:cur = cur.nextnode.next = self.__headcur.next = nodedef add(self,item):"""鏈表頭部添加元素,頭插法"""# 先創建一個保存item值的節點node = Node(item)if self.is_empty(): #空鏈表的情況#一般的鏈表有兩個位置,都需要設置一下self.__head = nodenode.next = node #這句話是指向自身的意思else:# 將新節點的鏈接域next指向頭節點,即_head指向的位置cur = self.__headwhile cur.next != self.__head:cur = cur.next#退出循環,cur指向尾節點node.next = self.__headself.__head = node#cur.next = node #這句話跟下面的一句話意思相同,但是不容易理解cur.next = self.__head#中間位置插入元素,不涉及到尾部鏈接,就是一個單鏈表的形式#pos是指定的位置,item是保存的元素def insert(self,pos,item):"""鏈表指定位置添加元素:param pos 從0開始"""# 若指定位置pos為第一個元素之前,則執行頭部插入if pos<=0: #頭插法self.add(item)# 若指定位置超過鏈表尾部,則執行尾部插入elif pos > (self.length()-1):#尾插法self.append(item)# 找到指定位置else:# pre用來指向指定位置pos的前一個位置pos-1,初始從頭節點開始移動到指定位置prev = self.__headcount = 0while count<(pos-1):count+=1prev = prev.next#當循環退出后,prev指向pos-1位置node = Node(item)# 先將新節點node的next指向插入位置的節點# prev.next存儲的是下一個節點的地址,因為是在任意位置插入的,新節點node需要連接下一個節點,node.next指向了下一個節點node.next = prev.next# 將插入位置的前一個節點的next指向新節點prev.next = nodedef search(self,item):"""查找節點是否存在""""""鏈表查找節點是否存在,并返回True或者False"""if self.is_empty():return Falsecur = self.__headwhile cur.next != self.__head:if cur.elem == item:return Trueelse:cur = cur.next#退出循環,cur指向尾節點,需要比較一下最后一個元素是否等于item,等于返回trueif cur.elem == item:return Truereturn Falsedef remove(self,item):"""刪除節點"""if self.is_empty():returncur = self.__headpre = Nonewhile cur.next != self.__head:# 找到了指定元素if cur.elem == item:#先判斷此節點是否是頭節點#頭節點 # 如果第一個就是刪除的節點if cur == self.__head:#頭節點的情況#找尾節點rear = self.__headwhile rear.next != self.__head:rear = rear.next# 將頭指針指向頭節點的后一個節點self.__head = cur.nextrear.next = self.__headelse:#中間節點# 將刪除位置前一個節點的next指向刪除位置的后一個節點pre.next = cur.next#break # 刪除后再退出循環,需要一個總的break退出return #break只是循環退出,這里需要一個函數退出,就是returnelse:# 繼續按鏈表后移節點pre = curcur = cur.next#退出循環,cur指向尾節點if cur.elem == item:if cur == self.__head:#這塊還有問題,當有好幾個節點,走到尾節點的時候#鏈表只有一個節點self.__head = Noneelse:# 將刪除位置前一個節點的next指向刪除位置的后一個節點#pre.next = cur.next #這句話跟下面一句話的意思一樣pre.next = self.__headif __name__ == "__main__":# node = Node(100)ll = SingleCycleLinkList()print(ll.is_empty()) #Trueprint(ll.length()) #0ll.append(1)print(ll.is_empty()) #Falseprint(ll.length()) #1#ll.append(2)ll.add(8)ll.append(3)ll.append(4)ll.append(5)ll.append(6)#8 1 2 3 4 5 6ll.insert(-1,9)ll.travel() #9 8 1 2 3 4 5 6ll.insert(3, 100)ll.travel() #9 8 1 100 2 3 4 5 6ll.insert(10,200)ll.travel() #9 8 1 100 2 3 4 5 6 200ll.remove(100)ll.travel() #9 8 1 2 3 4 5 6 200ll.remove(9)ll.travel() #8 1 2 3 4 5 6 200ll.remove(200)ll.travel() #8 1 2 3 4 5 6

參考資料:網上的教程

?

總結

以上是生活随笔為你收集整理的python算法与数据结构-循环链表的全部內容,希望文章能夠幫你解決所遇到的問題。

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