常用線性結構——無序列表(Underedlist)的鏈表python實現

定義

無序列表:一種數據項按照相對位置存放的數據集 被稱爲“無序表unordered list”。
爲了簡單起見,我們假設列表不能包含重複項:例如,整數 54,26,93,17,77 和 31 的集合可以表示考試分數的簡單無序列表。請注意,我們將它們用逗號分隔,這是列表結構的常用方式。如果用無序表表示,這個列表顯示 [54,26,93,17,77,31]

無序表list操作:

  • List() 創建一個新的空列表。它不需要參數,並返回一個空列表。
  • add(item) 向列表中添加一個新項。它需要 item 作爲參數,並不返回任何內容。假定該 item 不在列表中。
  • remove(item) 從列表中刪除該項。它需要 item 作爲參數並修改列表。假設項存在於列表中。
  • search(item) 搜索列表中的項目。它需要 item 作爲參數,並返回一個布爾值。
  • isEmpty() 檢查列表是否爲空。它不需要參數,並返回布爾值。
  • size()返回列表中的項數。它不需要參數,並返回一個整數。
  • append(item) 將一個新項添加到列表末尾,使其成爲集合中最後一項。它需要 item 作爲參數,並不返回任何內容。假定該項不在列表中。
  • index(item) 返回項在列表中的位置。它需要 item 作爲參數並返回索引。假定該項在列表中。
  • insert(pos,item) 在位置 pos 處向列表中添加一個新項。它需要 item作爲參數並不返回任何內容。假設該項不在列表中,並且有足夠的現有項使其有 pos 的位置。
  • pop() 刪除並返回列表中的最後一個項。假設該列表至少有一個項。
  • pop(pos) 刪除並返回位置 pos 處的項。它需要 pos 作爲參數並返回項。假定該項在列表中。

鏈表實現無序表

鏈接表:不需要數據項依次存放在連續的存儲空間內。
數據存放位置沒有規則,但是數據項間建立鏈接指向,就可以保持其前後相對位置

節點node類

鏈表實現的最基本元素,由列表項(item,數據字段)和對應下一節點的引用組成。其包含訪問、修改數據,以及訪問下一個引用的等操作。
實現代碼:

class Node:
    def __init__(self,initdata):
        self.data = initdata
        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對象
temp=Node(93)

在這裏插入圖片描述

Unordered list 類

無序列表將從一組節點構建,每個節點通過顯式引用鏈接到下一個節點。只要我們知道在哪裏找到第一個節點(包含第一個項),之後的每個項可以通過連續跟隨下一個鏈接找到。考慮到這一點,UnorderedList 類必須保持對第一個節點的引用
設立一個屬性head,保存對第一個節點的引用,並判斷是否爲空

class UnorderedList:

    def __init__(self):
        self.head = None
    
    def isEmpty(self):
	    return self.head == None

在這裏插入圖片描述
Underedlist其他操作python實現:

    
    def isEmpty(self):
	    return self.head == None
	
	def add(self,item):
	    temp = Node(item)
	    #更改新節點的下一個引用以引用舊鏈表的第一個節點
	    temp.setNext(self.head)
	    #賦值語句設置列表的頭
	    self.head = temp
		#訪問和賦值的順序不能顛倒,因爲head是鏈表節點唯一的外部引用,顛倒將導致所有原始節點丟失並且不能再被訪問
		
	def size(self):
	    current = self.head
	    count = 0
	    while current != None:
	        count = count + 1
	        current = current.getNext()

	    return count
	
	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

	def remove(self,item):
	    current = self.head
	    previous = None
	    found = False
	    while not found:
	        if current.getData() == item:
	            found = True
	        #previous 必須先將一個節點移動到 current 的位置。此時,纔可以移動current
	        else:
	            previous = current
	            current = current.getNext()
		#如果要刪除的項目恰好是鏈表中的第一個項,鏈表的 head 需要改變
	    if previous == None:
	        self.head = current.getNext()
	    else:
	        previous.setNext(current.getNext())

操作過程解析:
鏈表的次序很重要!
鏈表的查找都是從表頭head開始,沿着next逐個查找,因此,添加數據項最快的位置是表頭,鏈表的首位置。
在這裏插入圖片描述
在這裏插入圖片描述
remove方法需要兩個步驟

  1. 搜索
  2. 刪除,
    但是current實際指向的是目標節點的引用,直接刪除會刪除前一個節點,因此引入previous這個外部引用。
    在這裏插入圖片描述
    在這裏插入圖片描述

鏈表的算法分析

對於鏈表的複雜度分析,主要看相應的方法是否涉及到鏈表的遍歷。
在這裏插入圖片描述
注意:鏈表實現的list,跟python內置的列表數據類型不同,其時間複雜度也有所差異,主要是因爲python內置的列表數據類型是基於順序存儲來實現的,並進行了優化

參考來源:陳斌,《數據結構與算法python版》
https://www.icourse163.org/learn/PKU-1206307812?tid=1450242471#/learn/content?type=detail&id=1214420511&cid=1218119335

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章