使用python實(shí)現(xiàn)鏈表操作
一、概念梳理
鏈表是計(jì)算機(jī)科學(xué)里面應(yīng)用應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu)之一。它是最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)之一,同時(shí)也是比較高階的數(shù)據(jù)結(jié)構(gòu)(例如棧、環(huán)形緩沖和隊(duì)列)
簡(jiǎn)單的說(shuō),一個(gè)列表就是單數(shù)據(jù)通過(guò)索引集合在一起。在C里面這叫做指針。比方說(shuō),一個(gè)數(shù)據(jù)元素可以由地址元素,地理元素、路由信息活著交易細(xì)節(jié)等等組成。但是鏈表里面的元素類(lèi)型都是一樣的,是一種特殊的列表。
一個(gè)單獨(dú)的列表元素叫做一個(gè)節(jié)點(diǎn)。這些節(jié)點(diǎn)不像數(shù)組一樣都按順序存儲(chǔ)在內(nèi)存當(dāng)中,相反,你可以通過(guò)一個(gè)節(jié)點(diǎn)指向另外一個(gè)節(jié)點(diǎn)的指針在內(nèi)存不同的地方找到這些元素。列表最后一項(xiàng)習(xí)慣用NIL表示,相當(dāng)于python里面的None
這里介紹兩種不同的列表——單鏈表和雙鏈表。雙鏈表中的某個(gè)節(jié)點(diǎn)只會(huì)指向列表中的下一個(gè)元素,但是在雙鏈表里面,當(dāng)前節(jié)點(diǎn)同時(shí)也會(huì)指向前一個(gè)節(jié)點(diǎn)。所以雙鏈表會(huì)占用更多的內(nèi)存,因?yàn)樗枰~外的變量去存儲(chǔ)索引
圖一、單鏈表
圖2:雙鏈表
單鏈表可以從頭到尾順序查詢(xún),但是反過(guò)來(lái)就不是那么容易了。然而,雙鏈表不管你是從哪個(gè)節(jié)點(diǎn)開(kāi)始,從任意方向查詢(xún)都是一樣的。在單鏈表中增加和刪除節(jié)點(diǎn)只需要兩步,但是在雙鏈表里就需要四步了。
但是在python里面沒(méi)有提供像雙鏈表一樣的數(shù)據(jù)結(jié)構(gòu),所以我們可以自己創(chuàng)建一個(gè)這樣的數(shù)據(jù)結(jié)構(gòu)
二、如果使用python創(chuàng)建鏈表
(1).將節(jié)點(diǎn)定義成一個(gè)數(shù)據(jù)結(jié)構(gòu)
首先我們將節(jié)點(diǎn)類(lèi)定義成ListNode,該類(lèi)在初始化實(shí)例對(duì)象時(shí),定義了兩個(gè)實(shí)例變量,其中data用來(lái)存儲(chǔ)節(jié)點(diǎn)的值,next用來(lái)存儲(chǔ)下一個(gè)節(jié)點(diǎn)的索引,下面詳細(xì)介紹一下一個(gè)節(jié)點(diǎn)要定義的方法和屬性
__init__():初始化節(jié)點(diǎn) self.data:存儲(chǔ)節(jié)點(diǎn)的值 self.next:存儲(chǔ)指向下一個(gè)節(jié)點(diǎn)的索引 has_value():將當(dāng)前節(jié)點(diǎn)值和其他的值比較
上面的方法和屬性涵蓋了一個(gè)節(jié)點(diǎn)應(yīng)有的基本屬性和行為
Listing1:The ListNode class
上面創(chuàng)建了最簡(jiǎn)單的節(jié)點(diǎn)類(lèi),下面初始化ListNode的對(duì)象
Listing2:初始化節(jié)點(diǎn)
上面創(chuàng)建了三個(gè)獨(dú)立的節(jié)點(diǎn)
(2)創(chuàng)建一個(gè)單鏈表類(lèi)
現(xiàn)在我們定義一個(gè)名為SingleLinkedList的類(lèi)去管理我們的節(jié)點(diǎn),它包含了下面這些方法:
__init__():初始化對(duì)象 list_length():返回節(jié)點(diǎn)數(shù)量 output_list():輸出節(jié)點(diǎn)值 add_list_item():在列表末尾增加一個(gè)新的節(jié)點(diǎn) unordered_search():根據(jù)一個(gè)特殊值去查詢(xún)列表 remove_list_item_by_id():根據(jù)節(jié)點(diǎn)id移除節(jié)點(diǎn)
下面一一講解這些方法
__init__()定義了head和tail,都初始化為None
Listing3:The SingleLinkedList class(part one)
(3)、添加節(jié)點(diǎn)
通過(guò)add_list_item()添加列表元素。先檢測(cè)是不是ListNode的實(shí)例,如果不是,就新建一個(gè)節(jié)點(diǎn)。如果列表還是空的話(huà),就把該節(jié)點(diǎn)當(dāng)作頭節(jié)點(diǎn),如果不是空,就將當(dāng)前節(jié)點(diǎn)指向下一個(gè)元素(也就是剛新添加的節(jié)點(diǎn))。把新節(jié)點(diǎn)添加到列表當(dāng)中
Listing4:The SinglelinkedList class(part two)
list_length()方法計(jì)算節(jié)點(diǎn)數(shù)量,返回列表的長(zhǎng)度。在一個(gè)循環(huán)當(dāng)中循環(huán)列表,self.next依次指向下一個(gè)節(jié)點(diǎn)
Listing5:The SingleLinkedList class(part three)
output_list()用來(lái)輸出新的節(jié)點(diǎn)值
Listing6:The SingleLinkedList class(part four)
下面我們初始化SingleLinkedList的實(shí)例track,然后創(chuàng)建4個(gè)節(jié)點(diǎn)。
(4)查詢(xún)列表
查詢(xún)整個(gè)列表使用unordered_search()。它需要使用一個(gè)額外的參數(shù)幫助查詢(xún)。列表的頭是切入點(diǎn)。
(5)、從列表中移除一個(gè)元素
從列表中移除一個(gè)節(jié)點(diǎn) 時(shí),指向該節(jié)點(diǎn)索引需要被移動(dòng)到,被移除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。被移除的節(jié)點(diǎn)會(huì)由python的垃圾回收機(jī)制清除
Listing10:Removing a node by node number
(6)、創(chuàng)建一個(gè)雙鏈表
創(chuàng)建雙鏈表其實(shí)就是在ListNode的基礎(chǔ)上,在創(chuàng)建一個(gè)previous的屬性
Listing11:Extended list node class
然后我們就可以依據(jù)上面的定義新建一個(gè)雙鏈表類(lèi)
添加新的節(jié)點(diǎn)跟單鏈表有所不同
移除雙鏈表中的節(jié)點(diǎn)
python實(shí)際運(yùn)用
輸出結(jié)果
(7)、使用隊(duì)列實(shí)現(xiàn)雙向列表
- Python實(shí)現(xiàn)環(huán)形鏈表
- Python3實(shí)現(xiàn)的判斷環(huán)形鏈表算法示例
- python單鏈表實(shí)現(xiàn)代碼實(shí)例
- Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之鏈表詳解
- 淺談Python單向鏈表的實(shí)現(xiàn)
- Python單鏈表的簡(jiǎn)單實(shí)現(xiàn)方法
- Python數(shù)據(jù)結(jié)構(gòu)與算法之列表(鏈表,linked list)簡(jiǎn)單實(shí)現(xiàn)
- Python實(shí)現(xiàn)針對(duì)給定單鏈表刪除指定節(jié)點(diǎn)的方法
- python雙向鏈表實(shí)現(xiàn)實(shí)例代碼
- python實(shí)現(xiàn)雙鏈表
相關(guān)文章
Python中列表、字典、元組、集合數(shù)據(jù)結(jié)構(gòu)整理
這篇文章主要介紹了Python中列表、字典、元組、集合數(shù)據(jù)結(jié)構(gòu)整理,較為詳細(xì)的分析了這幾類(lèi)數(shù)據(jù)結(jié)構(gòu)的具體用法及相關(guān)技巧,需要的朋友可以參考下2014-11-11使用matplotlib畫(huà)散點(diǎn)圖的方法
今天小編就為大家分享一篇使用matplotlib畫(huà)散點(diǎn)圖的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05在Python上基于Markov鏈生成偽隨機(jī)文本的教程
這篇文章主要介紹了在Python上基于Markov鏈生成偽隨機(jī)文本的教程,是一個(gè)基于馬爾可夫算法的小實(shí)現(xiàn),充分體現(xiàn)了Python在科學(xué)計(jì)算中的用途,需要的朋友可以參考下2015-04-04數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法
今天小編就為大家分享一篇數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python實(shí)現(xiàn)PS濾鏡的旋轉(zhuǎn)模糊功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)PS濾鏡的旋轉(zhuǎn)模糊功能,涉及Python基于skimage庫(kù)針對(duì)圖片進(jìn)行旋轉(zhuǎn)與模糊化處理的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Django3基于WebSocket實(shí)現(xiàn)WebShell的詳細(xì)過(guò)程
最近工作中需要開(kāi)發(fā)前端操作遠(yuǎn)程虛擬機(jī)的功能,簡(jiǎn)稱(chēng)WebShell,普通應(yīng)用大部分用的都是wsgi.py配合nginx部署線(xiàn)上服務(wù). 這次主要使用asgi.py,具體實(shí)現(xiàn)過(guò)程跟隨小編一起看看吧2021-08-08Python如何使用pymongo連接MongoDB數(shù)據(jù)庫(kù)并進(jìn)行相關(guān)操作
PyMongo是驅(qū)動(dòng)程序,使python程序能夠使用Mongodb數(shù)據(jù)庫(kù),使用python編寫(xiě)而成,下面這篇文章主要給大家介紹了關(guān)于Python如何使用pymongo連接MongoDB數(shù)據(jù)庫(kù)并進(jìn)行相關(guān)操作的相關(guān)資料,需要的朋友可以參考下2023-05-05