python實(shí)現(xiàn)雙向鏈表原理
雙向鏈表
一種更復(fù)雜的鏈表是“雙向鏈表”或“雙面鏈表”。每個(gè)節(jié)點(diǎn)有兩個(gè)鏈接:一個(gè)指向前一個(gè)節(jié)點(diǎn),當(dāng)此節(jié)點(diǎn)為第一個(gè)節(jié)點(diǎn)時(shí),指向空值;而另一個(gè)指向下一個(gè)節(jié)點(diǎn),當(dāng)此節(jié)點(diǎn)為最后一個(gè)節(jié)點(diǎn)時(shí),指向空值。
操作
is_empty() 鏈表是否為空
length() 鏈表長(zhǎng)度
travel() 遍歷鏈表
add(item) 鏈表頭部添加
append(item) 鏈表尾部添加
insert(pos, item) 指定位置添加
remove(item) 刪除節(jié)點(diǎn)
search(item) 查找節(jié)點(diǎn)是否存在
實(shí)現(xiàn)
class Node(object): ? ? """雙向鏈表節(jié)點(diǎn)""" ? ? def __init__(self, item): ? ? ? ? self.item = item ? ? ? ? self.next = None ? ? ? ? self.prev = None class DLinkList(object): ? ? """雙向鏈表""" ? ? def __init__(self): ? ? ? ? self.__head = None ? ? def is_empty(self): ? ? ? ? """判斷鏈表是否為空""" ? ? ? ? return self.__head == None ? ? def length(self): ? ? ? ? """返回鏈表的長(zhǎng)度""" ? ? ? ? cur = self.__head ? ? ? ? count = 0 ? ? ? ? while cur != None: ? ? ? ? ? ? count += 1 ? ? ? ? ? ? cur = cur.next ? ? ? ? return count ? ? def travel(self): ? ? ? ? """遍歷鏈表""" ? ? ? ? cur = self.__head ? ? ? ? while cur != None: ? ? ? ? ? ? print cur.item, ? ? ? ? ? ? cur = cur.next ? ? ? ? print "" ? ? def add(self, item): ? ? ? ? """頭部插入元素""" ? ? ? ? node = Node(item) ? ? ? ? if self.is_empty(): ? ? ? ? ? ? # 如果是空鏈表,將_head指向node ? ? ? ? ? ? self.__head = node ? ? ? ? else: ? ? ? ? ? ? # 將node的next指向_head的頭節(jié)點(diǎn) ? ? ? ? ? ? node.next = self.__head ? ? ? ? ? ? # 將_head的頭節(jié)點(diǎn)的prev指向node ? ? ? ? ? ? self.__head.prev = node ? ? ? ? ? ? # 將_head 指向node ? ? ? ? ? ? self.__head = node ? ? def append(self, item): ? ? ? ? """尾部插入元素""" ? ? ? ? node = Node(item) ? ? ? ? if self.is_empty(): ? ? ? ? ? ? # 如果是空鏈表,將_head指向node ? ? ? ? ? ? self.__head = node ? ? ? ? else: ? ? ? ? ? ? # 移動(dòng)到鏈表尾部 ? ? ? ? ? ? cur = self.__head ? ? ? ? ? ? while cur.next != None: ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? # 將尾節(jié)點(diǎn)cur的next指向node ? ? ? ? ? ? cur.next = node ? ? ? ? ? ? # 將node的prev指向cur ? ? ? ? ? ? node.prev = cur ? ? def search(self, item): ? ? ? ? """查找元素是否存在""" ? ? ? ? cur = self.__head ? ? ? ? while cur != None: ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? cur = cur.next ? ? ? ? return False
指定位置插入節(jié)點(diǎn)
def insert(self, pos, item): ? ? ? ? """在指定位置添加節(jié)點(diǎn)""" ? ? ? ? if pos <= 0: ? ? ? ? ? ? self.add(item) ? ? ? ? elif pos > (self.length()-1): ? ? ? ? ? ? self.append(item) ? ? ? ? else: ? ? ? ? ? ? node = Node(item) ? ? ? ? ? ? cur = self.__head ? ? ? ? ? ? count = 0 ? ? ? ? ? ? # 移動(dòng)到指定位置的前一個(gè)位置 ? ? ? ? ? ? while count < (pos-1): ? ? ? ? ? ? ? ? count += 1 ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? # 將node的prev指向cur ? ? ? ? ? ? node.prev = cur ? ? ? ? ? ? # 將node的next指向cur的下一個(gè)節(jié)點(diǎn) ? ? ? ? ? ? node.next = cur.next ? ? ? ? ? ? # 將cur的下一個(gè)節(jié)點(diǎn)的prev指向node ? ? ? ? ? ? cur.next.prev = node ? ? ? ? ? ? # 將cur的next指向node ? ? ? ? ? ? cur.next = node
刪除元素
def remove(self, item): ? ? ? ? """刪除元素""" ? ? ? ? cur = self.__head ? ? ? ? while cur != None: ? ? ? ? ? ? # 找到了要?jiǎng)h除的元素 ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? # 先判斷此結(jié)點(diǎn)是否是頭節(jié)點(diǎn) ? ? ? ? ? ? ? ? # 頭節(jié)點(diǎn) ? ? ? ? ? ? ? ? if cur == self.__head: ? ? ? ? ? ? ? ? ? ? self.__head = cur.next ? ? ? ? ? ? ? ? ? ? # 如果存在下一個(gè)結(jié)點(diǎn),則設(shè)置下一個(gè)結(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? if cur.next: ? ? ? ? ? ? ? ? ? ? ? ? # 判斷鏈表是否只有一個(gè)結(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = None ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? cur.prev.next = cur.next ? ? ? ? ? ? ? ? ? ? # 如果存在下一個(gè)結(jié)點(diǎn),則設(shè)置下一個(gè)結(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? if cur.next: ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = cur.prev ? ? ? ? ? ? ? ? break ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? cur = cur.next
測(cè)試
if __name__ == "__main__": ? ? ll = DLinkList() ? ? ll.add(1) ? ? ll.add(2) ? ? ll.append(3) ? ? ll.insert(2, 4) ? ? ll.insert(4, 5) ? ? ll.insert(0, 6) ? ? print "length:",ll.length() ? ? ll.travel() ? ? print ll.search(3) ? ? print ll.search(4) ? ? ll.remove(1) ? ? print "length:",ll.length() ? ? ll.travel()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python對(duì)象及面向?qū)ο蠹夹g(shù)詳解
這篇文章主要介紹了python對(duì)象及面向?qū)ο蠹夹g(shù),結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο笏婕暗念?lèi)、對(duì)象、方法、屬性等概念與使用技巧,需要的朋友可以參考下2016-07-07python3.7安裝matplotlib失敗問(wèn)題的完美解決方法
由于學(xué)習(xí)需要安裝matplotlib庫(kù),閱讀網(wǎng)上教程后一直出現(xiàn)各種各樣的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于python3.7安裝matplotlib失敗問(wèn)題的完美解決方法,需要的朋友可以參考下2022-07-07python字符串大小寫(xiě)轉(zhuǎn)換的三種方法
本文主要介紹了python字符串大小寫(xiě)轉(zhuǎn)換的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python udp網(wǎng)絡(luò)程序?qū)崿F(xiàn)發(fā)送、接收數(shù)據(jù)功能示例
這篇文章主要介紹了Python udp網(wǎng)絡(luò)程序?qū)崿F(xiàn)發(fā)送、接收數(shù)據(jù)功能,結(jié)合實(shí)例形式分析了Python使用socket模塊進(jìn)行udp套接字創(chuàng)建、數(shù)據(jù)收發(fā)等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12女友半夜加班發(fā)自拍 python男友用30行代碼發(fā)現(xiàn)驚天秘密
大家好,我是Lex 喜歡欺負(fù)超人那個(gè)Lex 女友說(shuō)今晚加班,還給我發(fā)了一張照片? 我心生懷疑,就用python分析了一下照片,結(jié)果發(fā)現(xiàn)。。。 劃重點(diǎn):利用Python讀取照片的GPS信息信息2021-08-08python讀取raw binary圖片并提取統(tǒng)計(jì)信息的實(shí)例
今天小編就為大家分享一篇python讀取raw binary圖片并提取統(tǒng)計(jì)信息的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python腳本作為Windows服務(wù)啟動(dòng)代碼詳解
本篇文章給大家分享了用python腳本寫(xiě)出作為Windows服務(wù)啟動(dòng)功能,對(duì)此有需求的朋友跟著小編一起學(xué)習(xí)下。2018-02-02[機(jī)器視覺(jué)]使用python自動(dòng)識(shí)別驗(yàn)證碼詳解
這篇文章主要介紹了python自動(dòng)識(shí)別驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05