python算法与数据结构-循环链表
生活随笔
收集整理的這篇文章主要介紹了
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算法与数据结构-循环链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带氵字旁的女孩名字有哪些字
- 下一篇: python算法与数据结构-希尔排序算法