欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python實(shí)現(xiàn)鏈表操作

 更新時(shí)間:2018年01月26日 16:36:11   作者:黑加侖妞  
鏈表是計(jì)算機(jī)科學(xué)里面應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu)之一。這篇文章主要介紹了使用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)雙向列表

相關(guān)文章

  • python安裝gdal的兩種方法

    python安裝gdal的兩種方法

    這篇文章主要介紹了python安裝gdal的兩種方法,每種方法給大家介紹的都非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python中列表、字典、元組、集合數(shù)據(jù)結(jié)構(gòu)整理

    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)圖的方法

    今天小編就為大家分享一篇使用matplotlib畫(huà)散點(diǎn)圖的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • selenium中BasicAuth認(rèn)證彈框處理

    selenium中BasicAuth認(rèn)證彈框處理

    本文主要介紹了selenium中BasicAuth認(rèn)證彈框處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 在Python上基于Markov鏈生成偽隨機(jī)文本的教程

    在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的方法

    今天小編就為大家分享一篇數(shù)組保存為txt, npy, csv 文件, 數(shù)組遍歷enumerate的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Pycharm如何運(yùn)行.py文件的方法步驟

    Pycharm如何運(yùn)行.py文件的方法步驟

    這篇文章主要介紹了Pycharm如何運(yùn)行.py文件的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python實(shí)現(xiàn)PS濾鏡的旋轉(zhuǎn)模糊功能示例

    Python實(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-01
  • Django3基于WebSocket實(shí)現(xiàn)WebShell的詳細(xì)過(guò)程

    Django3基于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-08
  • Python如何使用pymongo連接MongoDB數(shù)據(jù)庫(kù)并進(jìn)行相關(guān)操作

    Python如何使用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

最新評(píng)論