Python代碼實(shí)現(xiàn)雙鏈表
本文實(shí)例為大家分享了Python代碼實(shí)現(xiàn)雙鏈表的具體代碼,供大家參考,具體內(nèi)容如下
雙鏈表的每個節(jié)點(diǎn)有兩個指針: 一個指向后一個節(jié)點(diǎn),另一個指向前一個節(jié)點(diǎn)
class Node(object): ?? ?def __init__(self, item=None): ?? ??? ?#放數(shù)據(jù) ?? ??? ?self.item= item ?? ??? ?#指向后一個節(jié)點(diǎn) ?? ??? ?self.next = None ?? ??? ?#指向前一個節(jié)點(diǎn) ?? ??? ?self.prior =None
此時當(dāng)前鏈表第一個節(jié)點(diǎn)就是頭節(jié)點(diǎn)指向的節(jié)點(diǎn) 20就是第一個節(jié)點(diǎn) 下圖
node.next = self.head 當(dāng)前節(jié)點(diǎn)指向原第一個節(jié)點(diǎn)
頭插法
如何插入呢
插入
p.next = curNode.next #指向后一個節(jié)點(diǎn)
curNode.next.prior = p #指向前一個節(jié)點(diǎn)
刪除
雙鏈表刪除
考慮特殊情況刪除的
正常刪除
雙鏈表刪除 30
#雙鏈表頭插法
#停在前一個位置了
count < (pos -1 )
#雙向鏈表 ?從左往右讀 class Node(object): ? ? ? ? """雙向鏈表節(jié)點(diǎn)""" ? ? ? ? def __init__(self,item): ? ? ? ? ? ? ? ? #放數(shù)據(jù)的節(jié)點(diǎn) ? ? ? ? ? ? ? ? self.elem = item ? ? ? ? ? ? ? ? #指向后一個節(jié)點(diǎn) ? ? ? ? ? ? ? ? self.next = None ? ? ? ? ? ? ? ? #指向前一個節(jié)點(diǎn) ? ? ? ? ? ? ? ? self.prev = None #雙向鏈表 class LinkList(object): ? ? ? ? def __init__(self,node=None): ? ? ? ? ? ? ? ? #代表頭節(jié)點(diǎn) ? ? ? ? ? ? ? ? self.__head = node ? ? ? ? #判斷鏈表是否為空 ? ? ? ? def is_empty(self): ? ? ? ? ? ? ? ? return self.__head == None ? ? ? ? def length(self): ? ? ? ? ? ? ? ? """返回鏈表的長度""" ? ? ? ? ? ? ? ? #cur游標(biāo)移動,從而實(shí)現(xiàn)遍歷元素的功能 ? ? ? ? ? ? ? ? cur = self.__head ? ? ? ? ? ? ? ? #count用來計(jì)數(shù) ? ? ? ? ? ? ? ? count = 0 ? ? ? ? ? ? ? ? while cur != None: ? ? ? ? ? ? ? ? ? ? ? ? count += 1 ? ? ? ? ? ? ? ? ? ? ? ? #讓cur游標(biāo)可以向下移動 ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? return count ? ? ? ? #遍歷整個鏈表 ? ? ? ? def travel(self): ? ? ? ? ? ? ? ? if self.is_empty(): ? ? ? ? ? ? ? ? ? ? ? ? return ? ? ? ? ? ? ? ? #建立游標(biāo)等于起始節(jié)點(diǎn) ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? cur = self.__head ? ? ? ? ? ? ? ? ? ? ? ? while cur != None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print(cur.elem,end=" ") ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? ? ? ? ? print("") ? ? ? ? #頭插法 ? ? ? ? def add(self,item): ? ? ? ? ? ? ? ? #新節(jié)點(diǎn) ? ? ? ? ? ? ? ? node = Node(item) ? ? ? ? ? ? ? ? if self.is_empty(): ? ? ? ? ? ? ? ? ? ? ? ? #頭節(jié)點(diǎn)指向了新的節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? self.__head = node ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? #新節(jié)點(diǎn)指向原第一個節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? node.next = self.__head ? ? ? ? ? ? ? ? ? ? ? ? self.__head = node ? ? ? ? ? ? ? ? ? ? ? ? node.next.prev = node ? ? ? ? def append(self,item): ? ? ? ? ? ? ? ? """鏈表尾部添加元素""" ? ? ? ? ? ? ? ? node = Node(item) ?#定義新節(jié)點(diǎn) ? ? ? ? ? ? ? ? #鏈表是否為空鏈表 ? ? ? ? ? ? ? ? if self.is_empty(): ? ? ? ? ? ? ? ? ? ? ? ? #如果為空,新的節(jié)點(diǎn)加了進(jìn)去 ? ? ? ? ? ? ? ? ? ? ? ? self.__head = node ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? #頭節(jié)點(diǎn) 創(chuàng)建游標(biāo) ? ? ? ? ? ? ? ? ? ? ? ? cur = self.__head ? #設(shè)置指向頭結(jié)點(diǎn)的游標(biāo) ?此時的當(dāng)前鏈表第一個節(jié)點(diǎn),就是頭節(jié)點(diǎn)指向的節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? #cur到最后一個節(jié)點(diǎn)停下 ? ? ? ? ? ? ? ? ? ? ? ? while cur.next != None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? ? ? ? ? #添加節(jié)點(diǎn)到尾部 cur道了最后一個結(jié)點(diǎn) ?cur.next指向了新的節(jié)點(diǎn)node ?從左往右讀 ? ? ? ? ? ? ? ? ? ? ? ? ? cur.next = node ? ? ? ? ? ? ? ? ? ? ? ? #當(dāng)前的節(jié)點(diǎn)指向它前一個 ? ? ? ? ? ? ? ? ? ? ? ? node.prev = cur ? ? ? ? #插入法 ?#pos從零開始 ? ? ? ? def insert(self,pos,item): ? ? ? ? ? ? ? ? """在指定位置添加元素""" ? ? ? ? ? ? ? ? #指向不是頭部元素,self.__head的地址 ? ? ? ? ? ? ? ? # 為下一個元素,所以pre為下一個元素 ? ? ? ? ? ? ? ? if pos <= 0: ? ? ? ? ? ? ? ? ? ? ? ? #認(rèn)為是頭插法 ? ? ? ? ? ? ? ? ? ? ? ? self.add(item) ? ? ? ? ? ? ? ? #假如長度是3 pos大于2要特殊處理 ? ? ? ? ? ? ? ? ? elif pos > (self.length()-1): ? ? ? ? ? ? ? ? ? ? ? ? #尾插法 ? ? ? ? ? ? ? ? ? ? ? ? self.append(item) ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ?? ??? ?#創(chuàng)建節(jié)點(diǎn) 新節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? node = Node(item) ? ? ? ? ? ? ? ? ? ? ? ? cur = self.__head ? ? ? ? ? ? ? ? ? ? ? ? count = 0 ? ? ? ? ? ? ? ? ? ? ? ? #動起來 ? ? ? ? ? ? ? ? ? ? ? ? while count < pos: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count+=1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #把節(jié)點(diǎn)鏈接到中間任意位置 插入前一個節(jié)點(diǎn) ? 此時,cur停在后一個節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? node.next = cur ? ? ? ? ? ? ? ? ? ? ? ? node.prev = cur.prev ? ? ? ? ? ? ? ? ? ? ? ? cur.prev.next = node ? ? ? ? ? ? ? ? ? ? ? ? cur.prev = node ? ? ? ? def remove(self,item): ? ? ? ? ? ? ? ? """刪除元素""" ? ? ? ? ? ? ? ? if self.is_empty(): ? ? ? ? ? ? ? ? ?? ?return ? ? ? ? ? ? ? ? cur = self.__head ? ? ? ? ? ? ? ? #查找所有的位置有沒有要刪除的,若有則刪除 ? ? ? ? ? ? ? ? while cur != None: ? ? ? ? ? ? ? ? ?? ??? ?#判斷cur指向的數(shù)據(jù),是否為要刪除的數(shù)據(jù) ? item要刪除的元素 ? ? ? ? ? ? ? ? ? ? ? ? if cur.elem == item: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #判斷此節(jié)點(diǎn)是否為頭節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #考慮特殊情況,恰好要刪除是第一個元素 ? ?當(dāng)前的元素就是我要刪除的元素? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if cur == self.__head: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #如果刪除中間, ?頭節(jié)點(diǎn)指向后一個節(jié)點(diǎn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? self.__head = cur.next ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #考慮鏈表只有一個節(jié)點(diǎn) ?直接指向None ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if cur.next != None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #是否只有一個節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = None ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #中間節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur.prev.next = cur.next ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if cur.next != None: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = cur.prev ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #沒有找到,cur游標(biāo)向繼續(xù)往下移動 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? def search(self,item): ? ? ? ? ? ? ? ? """查找結(jié)點(diǎn)是否存在""" ? ? ? ? ? ? ? ? #如果是一個空鏈表 ? ? ? ? ? ? ? ? if self.is_empty(): ? ? ? ? ? ? ? ? ? ? ? ? return False ? ? ? ? ? ? ? ? cur = self.__head ? ? ? ? ? ? ? ? while cur.next != self.__head: ? ? ? ? ? ? ? ? ? ? ? ? #cur數(shù)據(jù)是否為查找的數(shù)據(jù) item是要查的數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ? ? ? if cur.elem == item: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? #遍歷完成 cur指向None ? ? ? ? ? ? ? ? return False if __name__ == '__main__': ? ? ? ? ll = LinkList() ? ? ? ? #第一次的 ? ? ? ? print(ll.is_empty()) ? ? ? ? print(ll.length()) ? ? ? ? ll.append(1) ? ? ? ? print(ll.is_empty()) ? ? ? ? print(ll.length()) ? ? ? ? ll.append(2) ? ? ? ? ll.append(3) ? ? ? ? ll.append(4) ? ? ? ? ll.append(5) ? ? ? ? ll.travel() ? ? ? ? ll.insert(-1,50) ? ? ? ? ll.travel() ? ? ? ? ll.insert(2,60) ? ? ? ? ll.travel() ? ? ? ? ll.insert(10,300) ? ? ? ? ll.travel() ? ? ? ? ll.remove(50) ? ? ? ? ll.travel() ? ? ? ? ll.remove(300) ? ? ? ? ll.travel()
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python雙向鏈表實(shí)現(xiàn)實(shí)例代碼
- Python單向鏈表和雙向鏈表原理與用法實(shí)例詳解
- Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法
- Python編程實(shí)現(xiàn)雙鏈表,棧,隊(duì)列及二叉樹的方法示例
- Python二叉搜索樹與雙向鏈表轉(zhuǎn)換算法示例
- Python數(shù)據(jù)結(jié)構(gòu)之雙向鏈表的定義與使用方法示例
- Python雙向循環(huán)鏈表實(shí)現(xiàn)方法分析
- python雙向鏈表原理與實(shí)現(xiàn)方法詳解
- Python雙鏈表原理與實(shí)現(xiàn)方法詳解
- Python數(shù)據(jù)結(jié)構(gòu)之雙向鏈表詳解
相關(guān)文章
在python里使用await關(guān)鍵字來等另外一個協(xié)程的實(shí)例
這篇文章主要介紹了在python里使用await關(guān)鍵字來等另外一個協(xié)程的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python利用google翻譯方法實(shí)例(翻譯字幕文件)
這篇文章主要給大家介紹了關(guān)于python利用google翻譯(翻譯字幕文件)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python實(shí)現(xiàn)圖像壓縮和圖像處理詳解
隨著現(xiàn)在短視頻類越來越火,隨之而來的就是大量的視頻圖像的處理。這篇文章主要為大家介紹了Python如何一鍵實(shí)現(xiàn)圖像壓縮和圖像處理,希望對你們有所幫助2022-07-07解決Pytorch dataloader時報(bào)錯每個tensor維度不一樣的問題
這篇文章主要介紹了解決Pytorch dataloader時報(bào)錯每個tensor維度不一樣的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05Python 實(shí)現(xiàn)鏈表實(shí)例代碼
這篇文章主要介紹了Python 實(shí)現(xiàn)鏈表實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04Python基礎(chǔ)數(shù)據(jù)類型tuple元組的概念與用法
元組(tuple)是 Python 中另一個重要的序列結(jié)構(gòu),和列表類似,元組也是由一系列按特定順序排序的元素組成,這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)數(shù)據(jù)類型tuple元組的概念與使用方法,需要的朋友可以參考下2021-07-07Pycharm正版2022.2.2?官方翻譯插件更新tkk失敗不能用問題及解決方案
這篇文章主要介紹了Pycharm正版2022.2.2?|?官方翻譯插件更新tkk失敗解決,?出現(xiàn)tkk問題的是這個翻譯插件,本教程只解決該翻譯插件不能用的問題,需要的朋友可以參考下2022-11-11