從Python認識資料結構(四).陣列

更新 發佈閱讀 4 分鐘
vocus|新世代的創作平台

各位好,再開始新的章節前,我們先對鏈結串列(Linked List)做一些補充,我們在從Python認識資料結構(三).陣列與之前的文章中設計了許多動態鏈結串列,也提過鏈結串列的好處是不用提前指定記憶體空間,較靜態結構來說更保有彈性,但在之前的範例我們會發現,鏈結串列也隱藏了一些問題,舉例來說,最明顯的問題就是當我們丟失了head節點時,我們就直接失去了整個串列資料。為了能避免上述問題發生,我們可以設計與過往稍有不同的鏈結串列來處理這個問題。


4-1、單向鏈結串列 vs. 環形鏈結串列

這邊我們要先清楚的區分單向鏈結串列(Single Linked List)與環形鏈結串列(Circular Linked List)的差異,過往我們所介紹的功能實作方法都是建立單向鏈結串列,由首節點head出發,最後一個節點的next屬性指向None;環形鏈結串列則是將最後一個節點的next屬性指向head,如此一來,就算我們丟失了head節點,也可以從串列中的任何一個節點找回所有資料,避免了單向鏈結串列會造成的問題,如下圖。

vocus|新世代的創作平台

環形鏈結串列的走訪有一個部分要提醒的是,通常在單向鏈節串列中,while回圈內判斷的中止條件都是(ptr != None),這是因為單向鏈結串列最後一個節點的next屬性為None,當ptr等於None時,也代表我們正處於最後一個節點位置。環形鏈結就有所不同,環形鏈結最後一個節點的next屬性指向了head,如果我們依舊採用等於None來作為判斷跳出的條件,那麼迴圈將不停地重複,所以我們將終止條件設定為(ptr != head),來確保我們完成了一趟環形鏈結串列的走訪。



4-2、單向鏈結串列 vs. 雙向鏈結串列(Double Linked List)

既然有單向鏈結串列,肯定也有雙向的鏈結串列。無論是單向鏈結串列,或是剛剛提到的環形鏈結串列,不難發現其都是依照順序向右(如4-1圖示)尋找下一個節點位置,此時若發生鏈結斷裂,可能是丟失或被錯誤賦值,就會使得整個單向鏈結串列資訊遺失。為了避免此情況,我們可以設計雙向鏈結串列,此串列不僅向右邊鏈結,同時也向左鏈結前位節點位置,如此一來,即使節點其中一個鏈節斷裂,也可以透過另一條鏈結重新建立起節點順序。

雙向與環形兩者不衝突,下圖是由4-1所設計的環形鏈結串列結構修改後的環形雙向鏈結串列同時保持了環形與雙向鏈結的特色:最後一個節點的next屬性指向head,以及具有兩方向的鏈結,分別指向前一個與後一個節點位置

相較於單向鏈結串列,雙向鏈結串列雖避免了鏈結丟失的問題,但同時也需要更多的記憶體空間來儲存前位節點位置,實際上使用仍須根據資料的型態來決定使用哪種資料結構。

vocus|新世代的創作平台

以下是透過手動方式設計雙向鏈結串列的方式,雙向鏈結的走訪可由head或最後一個節點當開頭,根據next或previous屬性找到下一個節點位置。至於新增、刪除或修改雙向鏈結串列的方式,就留給各位自己實做看看,與單向鏈結串列方式雷同,只是需要注意不要遺失前位節點的資料即可。


以上部分就是Python中建立陣列的方式介紹,順便多介紹了環形鏈結串列與雙向鏈結串列,下一節我們會介紹新的資料結構-堆疊(Stack),有任何問題歡迎寄信至我的信箱或於底下留言和我討論。



參考書目

  1. 圖解資料結構 - 使用Python(第二版)
  2. 圖書演算法 - 使用Python
  3. Python3 物件導向程式設計 第二版
  4. 精通Python (第二版)


留言
avatar-img
炯男孩的沙龍
4會員
8內容數
本專題將以Python程式語言來實作資料結構,依序從陣列(Array)、堆疊(Stack)、佇列(Queue)、樹(Tree)到圖(Graph),透過不同方式來建立資料結構,並討論部分細節如:建構難度、記憶體空間、效率等等。
炯男孩的沙龍的其他內容
2022/07/12
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
2022/07/12
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
2022/07/08
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
2022/07/08
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
2022/07/07
陣列是Python語言的最基礎也最容易實作的資料結構,主要可以透過兩種方式在Python上實踐陣列,其中一種是靜態結構 - 串列(List),另一種則是動態結構 - 鏈結串列(Linked List)。 我們會依序介紹這兩種作法如何在Python上執行陣列的相關功能,並比較兩種方法之間的差異。
Thumbnail
2022/07/07
陣列是Python語言的最基礎也最容易實作的資料結構,主要可以透過兩種方式在Python上實踐陣列,其中一種是靜態結構 - 串列(List),另一種則是動態結構 - 鏈結串列(Linked List)。 我們會依序介紹這兩種作法如何在Python上執行陣列的相關功能,並比較兩種方法之間的差異。
Thumbnail
看更多
你可能也想看
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
題目敘述 題目會給定我們一條鏈結串列Linked list的起始節點,要求我們刪除Linked List正中央的節點。 註: 正中央的節點,題目定義為索引為floor( 串列長度 / 2 ) 的節點,索引從零(Head Node)出發開始數。 例如 1 -> 2 -> 3 -> 4 鏈結
Thumbnail
題目敘述 題目會給定我們一條鏈結串列Linked list的起始節點,要求我們刪除Linked List正中央的節點。 註: 正中央的節點,題目定義為索引為floor( 串列長度 / 2 ) 的節點,索引從零(Head Node)出發開始數。 例如 1 -> 2 -> 3 -> 4 鏈結
Thumbnail
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
在資料結構與演算法裡, 最簡單的線性資料結構除了list之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list 在這篇文章,會從最基礎的Singly linked list開始講起。 定義
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
題目敘述 題目會給我們一個鏈結串列的起點head,要求我們找出這個串列的中點。 註: 如果串列長度是偶數,就回傳中間偏右的那個節點。 例如: 1 -> 2 -> 3 回傳中點為2 1 -> 2 -> 3 -> 4 ->5 -> 6 回傳中點為4 詳細的題目可在這裡看到 測試範例
Thumbnail
題目敘述 題目會給我們一個鏈結串列的起點head,要求我們找出這個串列的中點。 註: 如果串列長度是偶數,就回傳中間偏右的那個節點。 例如: 1 -> 2 -> 3 回傳中點為2 1 -> 2 -> 3 -> 4 ->5 -> 6 回傳中點為4 詳細的題目可在這裡看到 測試範例
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News