摘要:數據結構實現鏈表簡單介紹鏈表是一種常見的基礎數據結構,是一種線性表,但是并不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針。圖解如下查找通過遍歷鏈表,使用標記是否找到了正在尋找的項。一旦為,就是對包含要刪除的項的節點的引用。
Python數據結構實現—鏈表 1. 簡單介紹
鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是并不會按線性的順序存儲數據,而是在每一個節點里存到下一個節點的指針(Pointer)。—— 維基百科
鏈表的基本構造塊是節點(Node)。我們將在文章的第2部分通過Python實現一個簡單的Node類。
一個單向鏈表的構造如下圖1所示包含兩個域:
信息域:當前節點的值(Data or Value)
指針域:指向下一個節點的指針鏈接(Reference or Link)
注1:必須明確指定鏈表的第一項的位置。一旦我們知道第一項在哪里,第一項目可以告訴我們第二項是什么,依次類推。按照一個方向遍歷,直到最后一項(最后一個節點),最后一項需要知道沒有下一項。
注2:這些節點在邏輯上是相連的,但要知道它們在物理內存上并不相連。
我們先來實現Node類:
class Node(object): def __init__(self, initdata): self.data = initdata # 引用None代表沒有下一節點 self.next = None # 獲得數據 def getData(self): return self.data # 獲得下一個節點的引用 def getNext(self): return self.next # 修改數據 def setData(self, newdata): self.data = newdata # 修改下一節點的引用 def setNext(self, newnext): self.next = newnext
創建一個Node對象試試:
>>> tmp = Node(33) >>> tmp <__main__.Node object at 0x1022699b0> >>> tmp.getData() 332.2 Unordered List類
只要知道第一個節點(包含第一個項),那么之后的每個節點都可以通過指向下一個節點的鏈接 依次找到。
考慮到這樣的情況,Unordered List類只要維護對第一個節點的引用就可以了。Unordered List類本身不包含任何節點對象,它只包含對鏈表結構中第一個節點的單個引用!
class unOrderedList(): def __init__(self): # 初始化None表示此時鏈表的頭部不引用任何內容 self.head = None
創建一個空的鏈表試試(如圖2所示):
>>> myList = unOrderedList()
我們可通過下面的 isEmpty() 方法檢查是否為空鏈表:
# 只有在鏈表中沒有節點的時候為真 def isEmpty(self): return self.head == None
添加元素后的鏈表是這樣的(如圖3所示),稍后在文章第3部分實現添加方法:
由于是在前端添加,因此最后添加的在最前端。
def add(self, item): temp = Node(item) # Step0:創建一個新節點并將新項作為數據 temp.setNext(self.head) # Step1:更改新節點的下一個引用以引用舊鏈表的第一個節點 self.head = temp # Step2:重新設置鏈表的頭以引用新節點
添加元素——執行mylist.add(26)時候的圖解如下:
>>> mylist.add(31) >>> mylist.add(77) >>> mylist.add(17) >>> mylist.add(93) >>> mylist.add(26)3.2 size()求鏈表長度
def size(self): current = self.head count = 0 while current != None: count += 1 current = current.getNext() return count
通過current遍歷鏈表并對節點計數。
圖解如下:
def search(self, item): current = self.head found = False while current != None and not found: if current.getData() == item: found = True else: current = current.getNext() return found
通過current遍歷鏈表,使用found標記是否找到了正在尋找的項。
圖解如下:
def remove(self, item): current = self.head previous = None found = False while not found: if current.getData() == item: found = True else: previous = current current = current.getNext() if previous == None: # 當要刪除的項目恰好是鏈表中的第一個項,這時候prev是None,需要修改head以引用current之后的節點 self.head = current.getNext() else: previous.setNext(current.getNext())
我們遍歷鏈表,先搜索,再刪除。
1.搜索:
使用previous與current進行移動,借助found標記是否找到。
一旦found為True,current就是對包含要刪除的項的節點的引用。
2.刪除(修改引用):
我們把previous的對下一節點的引用設為current的下一節點。
以上兩過程的圖解如下:
參考:
problem-solving-with-algorithms-and-data-structure-using-python
python-wikipedia
如有錯誤,還望指正~
完整實現及測試可在Github找到:Python-DataStructure-Implementation
感謝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40766.html
摘要:解決按學生年齡排序的實際問題問題定義一個包含姓名性別年齡,需要按年齡給學生排序。輸出按照年齡進行排序好的。思路使用冒泡排序,比較相鄰的學生,如果第一個學生的值比第二個學生的值大,那么就整體交換這兩個元素。 Python解決按學生年齡排序的實際問題 問題:定義一個Class:包含姓名name、性別gender、年齡age,需要按年齡給學生排序。輸入:包含學生對象的List。輸出:按照年齡...
摘要:線性表的和采用了順序表的實現技術,具有順序表的所有性質。刪除鏈表應丟棄這個鏈表里的所有結點。在語言中,就是檢查相應變量的值是否為。也就是說,插入新元素的操作是通過修改鏈接,接入新結點,從而改變表結構的方式實現的。 1.線性表 Python的list和tuple采用了順序表的實現技術,具有順序表的所有性質。 2.鏈接表 單向鏈接表 的結點是一個二元組。 其表元素域elem保存著作為表元素...
摘要:前言在上一章中我們介紹了的一些內部原理在這一章中我們再來討論在五種數據結構中的基本使用和一些內部實現基本介紹的呢相當于中的也是雙向鏈表具有一些和同樣的特征比如插入和刪除一條很快時間復雜度為獲取頭結點和尾節點也很快時間復雜度也為隨機讀取則相對 前言 在上一章中我們介紹了 String 的一些內部原理,在這一章中我們再來討論在五種數據結構中 List 的基本使用和一些內部實現. 基本介紹 ...
閱讀 3270·2021-10-11 10:59
閱讀 2836·2021-10-11 10:58
閱讀 2246·2021-09-04 16:45
閱讀 2724·2019-08-30 15:44
閱讀 678·2019-08-30 15:44
閱讀 3206·2019-08-30 10:51
閱讀 1602·2019-08-29 18:46
閱讀 2758·2019-08-29 13:57