python雙向鏈表實(shí)例詳解
使用python實(shí)現(xiàn)雙向鏈表,供大家參考,具體內(nèi)容如下
雙向鏈表: 指的是講數(shù)據(jù)鏈接在一起,每個(gè)數(shù)據(jù)是一個(gè)節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)都有一個(gè)數(shù)據(jù)區(qū),兩個(gè)鏈接區(qū),分別鏈接上一個(gè)節(jié)點(diǎn)和下一個(gè)節(jié)點(diǎn)
數(shù)據(jù)區(qū): 存放數(shù)據(jù)的地方
prev: 鏈接上一個(gè)節(jié)點(diǎn)
next: 鏈接下一個(gè)節(jié)點(diǎn)
雙向鏈表操作
1、鏈表是否為空
2、鏈表的長度
3、遍歷鏈表
4、鏈表頭部添加元素
5、鏈表尾部添加元素
6、鏈表指定位置添加元素
7、鏈表刪除節(jié)點(diǎn)
8、查找節(jié)點(diǎn)是否存在
代碼實(shí)現(xiàn)
# Functions ?函數(shù)聲明 class Node(): ? ? """實(shí)例化節(jié)點(diǎn)類""" ? ? def __init__(self, item): ? ? ? ? self.item = item ? ? ? ? self.prev = None ? ? ? ? self.next = None class Linklist(): ? ? """ ? ? 存儲(chǔ)所有節(jié)點(diǎn)類 ? ? """ ? ? def __init__(self): ? ? ? ? """ ? ? ? ? 初始化一個(gè)頭結(jié)點(diǎn) ? ? ? ? 默認(rèn)為空 ? ? ? ? """ ? ? ? ? self.head = None ? ? # 1. 鏈表是否為空 ? ? def is_empty(self): ? ? ? ? return self.head == None ? ? # 2. 鏈表的長度 ? ? def length(self): ? ? ? ? """ ? ? ? ? 返回節(jié)點(diǎn)的長度 ? ? ? ? 實(shí)例化一個(gè)游標(biāo) ? ? ? ? 使用這個(gè)游標(biāo)遍歷所有的數(shù)據(jù) ? ? ? ? 使用一個(gè)計(jì)數(shù)器,遍歷一個(gè)數(shù)據(jù),自增一,最后輸出計(jì)數(shù)器 ? ? ? ? """ ? ? ? ? # 實(shí)例化游標(biāo) ? ? ? ? cur = self.head ? ? ? ? # 技術(shù)器 ? ? ? ? # 如果鏈表為空,不會(huì)進(jìn)入循環(huán),直接輸出 0 ? ? ? ? count = 0 ? ? ? ? # 遍歷所有的數(shù)據(jù) ? ? ? ? while cur != None: ? ? ? ? ? ? count +=1 ? ? ? ? ? ? cur = cur.next ? ? ? ? return count ? ? # 3. 遍歷鏈表 ? ? def treval(self): ? ? ? ? """ ? ? ? ? 遍歷鏈表,獲取所有的數(shù)據(jù) ? ? ? ? 使用游標(biāo),遍歷整個(gè)鏈表,每次輸出cur.item 的值 ? ? ? ? 注意鏈表為空的情況, ? ? ? ? """ ? ? ? ? # 實(shí)例化一個(gè)游標(biāo) ? ? ? ? cur = self.head ? ? ? ? # 遍歷鏈表 ? ? ? ? while cur != None: ? ? ? ? ? ? print(cur.item, end=' ') ? ? ? ? ? ? cur = cur.next ? ? ? ? print() ? ? # 4. 鏈表頭部添加元素 ? ? def add(self, item): ? ? ? ? """ ? ? ? ? 頭部添加數(shù)據(jù) ? ? ? ? 分析: ? ? ? ? 1、頭部添加數(shù)據(jù),鏈表為空時(shí): self.head 指向node ? ? ? ? 2、鏈表不為空時(shí): 先將node.next = self.head.next, 再講 self.head = node ? ? ? ? """ ? ? ? ? # 實(shí)例化節(jié)點(diǎn) ? ? ? ? node = Node(item) ? ? ? ? # 添加數(shù)據(jù) ? ? ? ? # 判斷鏈表是否為空 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? # 為空,直接將self.head 指向node ? ? ? ? ? ? self.head=node ? ? ? ? else: ? ? ? ? ? ? # 不為空,先將noede ? ? ? ? ? ? node.next = self.head ? ? ? ? ? ? self.head.prev=node ? ? ? ? ? ? self.head=node ? ? # 5. 鏈表尾部添加元素 ? ? def append(self,item): ? ? ? ? """ ? ? ? ? 尾部添加數(shù)據(jù) ? ? ? ? 分析: ? ? ? ? 要先將指針指向尾部的節(jié)點(diǎn) ? ? ? ? 最后的節(jié)點(diǎn)的 cur.next = node, node.prev = cur ? ? ? ? """ ? ? ? ? # 實(shí)例化節(jié)點(diǎn) ? ? ? ? node = Node(item) ? ? ? ? # 實(shí)例化游標(biāo) ? ? ? ? cur = self.head ? ? ? ? # 移動(dòng)游標(biāo)到最后一個(gè)節(jié)點(diǎn) ? ? ? ? # 如果鏈表為空 ? ? ? ? # 直接使用頭插法 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? self.add(item) ? ? ? ? else: ? ? ? ? ? ? while cur.next != None: ? ? ? ? ? ? ? ? # cur.next 不為空,則進(jìn)入循環(huán), 上次循環(huán),是進(jìn)入上上個(gè)節(jié)點(diǎn),但 將cur ?= cur.next,就指向了最后一個(gè)節(jié)點(diǎn) ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? node.prev = cur ? ? ? ? ? ? cur.next = node ? ? # 6. 鏈表指定位置添加元素 ? ? def insert(self, index, item): ? ? ? ? """ ? ? ? ? 指定位置添加數(shù)據(jù) ? ? ? ? 分析 ? ? ? ? 單鏈表中需要實(shí)例化兩個(gè)有游標(biāo) ? ? ? ? 雙向鏈表,直接向指針指向索引的位置 ? ? ? ? 將這個(gè)位置節(jié)點(diǎn)的 cur. ? ? ? ? """ ? ? ? ? # 實(shí)例化節(jié)點(diǎn) ? ? ? ? node = Node(item) ? ? ? ? # 實(shí)例化游標(biāo) ? ? ? ? cur = self.head ? ? ? ? # 起始位置 ? ? ? ? count = 0 ? ? ? ? if index<=0: ? ? ? ? ? ? # 使用頭插法 ? ? ? ? ? ? self.add(item) ? ? ? ? elif index > (self.length()-1): ? ? ? ? ? ? self.append(item) ? ? ? ? else: ? ? ? ? ? ? # 移動(dòng)游標(biāo) ? ? ? ? ? ? while count < index: ? ? ? ? ? ? ? ? # 增加一 ? ? ? ? ? ? ? ? count += 1 ? ? ? ? ? ? ? ? # 移動(dòng)游標(biāo)到索引位置 ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? node.next = cur ? ? ? ? ? ? node.prev = cur.prev ? ? ? ? ? ? cur.prev.next = node ? ? ? ? ? ? cur.prev = node ? ? # 7. 鏈表刪除節(jié)點(diǎn) ? ? def remove(self,item): ? ? ? ? """ ? ? ? ? 刪除指定的節(jié)點(diǎn) ? ? ? ? 首先實(shí)例化節(jié)點(diǎn),遍歷鏈表,找到該節(jié)點(diǎn),刪除該節(jié)點(diǎn) ? ? ? ? """ ? ? ? ? # 實(shí)例化游標(biāo) ? ? ? ? cur = self.head ? ? ? ? # 遍歷鏈表,找到該節(jié)點(diǎn) ? ? ? ? while cur != None: ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? if self.head == cur: ? ? ? ? ? ? ? ? ? ? self.head = cur.next ? ? ? ? ? ? ? ? ? ? if cur.next: ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = None ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? cur.prev.next = cur.next ? ? ? ? ? ? ? ? ? ? # 如果有下個(gè)節(jié)點(diǎn),防止最后一個(gè)節(jié)點(diǎn) ? ? ? ? ? ? ? ? ? ? if cur.next: ? ? ? ? ? ? ? ? ? ? ? ? cur.next.prev = cur.prev ? ? ? ? ? ? ? ? ? ? pass ? ? ? ? ? ? ? ? break ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? cur = cur.next ? ? # # 8. 查找節(jié)點(diǎn)是否存在 ? ? def search(self, item): ? ? ? ? """ ? ? ? ? 查看節(jié)點(diǎn)是否存在 ? ? ? ? 分析 ? ? ? ? 遍歷鏈表,查看每一個(gè)節(jié)點(diǎn)的數(shù)據(jù)區(qū) ? ? ? ? 空鏈表 ? ? ? ? 只有頭節(jié)點(diǎn) ? ? ? ? 只有尾節(jié)點(diǎn) ? ? ? ? """ ? ? ? ? # 實(shí)例化一個(gè)游標(biāo) ? ? ? ? cur = self.head ? ? ? ? # 遍歷鏈表 ? ? ? ? while cur != None: ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? return False
測試運(yùn)行
# 程序的入口 if __name__ == "__main__": ? ? s = Linklist() ? ? print(s.is_empty()) ?# ?True ? ? s.append(100)? ? ? s.append(200) ? ? s.append(300) ? ? s.add(6) ? ? s.insert(1, 10) ? ? s.search(6) ? ? s.treval() ? # 6 10 100 200 300? ? ? s.remove(100) ? ? s.treval() ? # 6 10 200 300? ? ? pass
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用selenium和pyquery爬取京東商品列表過程解析
這篇文章主要介紹了使用selenium和pyquery爬取京東商品列表過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python中常用數(shù)據(jù)類型使用示例概括總結(jié)
這篇文章主要為大家介紹了Python中常用數(shù)據(jù)類型使用示例概括總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Python實(shí)現(xiàn)考試自動(dòng)答題的腳本分享
最近這段時(shí)間天氣正正好,不冷不熱,是學(xué)習(xí)考駕照的好時(shí)機(jī)。為了幫助大家能夠順利獲得駕照,小編為大家準(zhǔn)備了駕照考試的自動(dòng)答題小程序,希望對大家有所幫助2023-03-03pytest解讀一次請求多個(gè)fixtures及多次請求
這篇文章主要為大家介紹了一次請求多個(gè)fixtures,以及fixtures被多次請求的pytest官方解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06關(guān)于Python字符編碼與二進(jìn)制不得不說的一些事
這篇文章主要給大家介紹了關(guān)于Python字符編碼與二進(jìn)制不得不說的一些事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10