python随机生成无序列表_python实现无序列表:链表
介紹鏈表前我們先了解下什么是列表。
在對(duì)基本數(shù)據(jù)結(jié)構(gòu)的討論中,我們使用 Python 列表來實(shí)現(xiàn)所呈現(xiàn)的抽象數(shù)據(jù)類型。列表是一個(gè)強(qiáng)大但簡單的收集機(jī)制,為程序員提供了各種各樣的操作。然而,不是所有的編程語言都包括列表集合。在這些情況下,列表的概念必須由程序員實(shí)現(xiàn)。
列表是項(xiàng)的集合,其中每個(gè)項(xiàng)保持相對(duì)于其他項(xiàng)的相對(duì)位置。更具體地,我們將這種類型的列表稱為無序列表。我們可以將列表視為具有第一項(xiàng),第二項(xiàng),第三項(xiàng)等等。我們還可以引用列表的開頭(第一個(gè)項(xiàng))或列表的結(jié)尾(最后一個(gè)項(xiàng))。為了簡單起見,我們假設(shè)列表不能包含重復(fù)項(xiàng)。
例如,整數(shù) 54,26,93,17,77 和 31 的集合可以表示考試分?jǐn)?shù)的簡單無序列表。請(qǐng)注意,我們將它們用逗號(hào)分隔,這是列表結(jié)構(gòu)的常用方式。當(dāng)然,Python 會(huì)顯示這個(gè)列表為 [54,26,93,17,77,31]。
1 無序列表抽象數(shù)據(jù)類型
如上所述,無序列表的結(jié)構(gòu)是項(xiàng)的集合,其中每個(gè)項(xiàng)保持相對(duì)于其他項(xiàng)的相對(duì)位置。下面給出了一些可能的無序列表操作。
List() 創(chuàng)建一個(gè)新的空列表。它不需要參數(shù),并返回一個(gè)空列表。
add(item) 向列表中添加一個(gè)新項(xiàng)。它需要 item 作為參數(shù),并不返回任何內(nèi)容。假定該 item 不在列表中。
remove(item) 從列表中刪除該項(xiàng)。它需要 item 作為參數(shù)并修改列表。假設(shè)項(xiàng)存在于列表中。
search(item) 搜索列表中的項(xiàng)目。它需要 item 作為參數(shù),并返回一個(gè)布爾值。
isEmpty() 檢查列表是否為空。它不需要參數(shù),并返回布爾值。
size()返回列表中的項(xiàng)數(shù)。它不需要參數(shù),并返回一個(gè)整數(shù)。
append(item) 將一個(gè)新項(xiàng)添加到列表的末尾,使其成為集合中的最后一項(xiàng)。它需要 item
作為參數(shù),并不返回任何內(nèi)容。假定該項(xiàng)不在列表中。
index(item) 返回項(xiàng)在列表中的位置。它需要 item 作為參數(shù)并返回索引。假定該項(xiàng)在列表中。
insert(pos,item) 在位置 pos 處向列表中添加一個(gè)新項(xiàng)。它需要 item作為參數(shù)并不返回任何內(nèi)容。假設(shè)該項(xiàng)不在列表中,并且有足夠的現(xiàn)有項(xiàng)使其有 pos 的位置。
pop() 刪除并返回列表中的最后一個(gè)項(xiàng)。假設(shè)該列表至少有一個(gè)項(xiàng)。
pop(pos) 刪除并返回位置 pos 處的項(xiàng)。它需要 pos 作為參數(shù)并返回項(xiàng)。假定該項(xiàng)在列表中。
2 python實(shí)現(xiàn)無序列表
為了實(shí)現(xiàn)無序列表,我們將構(gòu)造通常所知的鏈表,外部引用通常被稱為鏈表的頭。
2.1 Node類
節(jié)點(diǎn)(Node)是鏈表實(shí)現(xiàn)的基本構(gòu)造,由列表項(xiàng)(item,數(shù)據(jù)字段)和對(duì)下一個(gè)節(jié)點(diǎn)的引用組成。Node 類包括訪問,修改數(shù)據(jù)和訪問下一個(gè)引用等常用方法。類的代碼如下:
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
我們創(chuàng)建一個(gè) Node 對(duì)象
temp=Node(93)
Python 引用值 None 將在 Node 類和鏈表本身發(fā)揮重要作用。引用 None 代表沒有下一個(gè)節(jié)點(diǎn)。請(qǐng)注意在構(gòu)造函數(shù)中,最初創(chuàng)建的節(jié)點(diǎn) next 被設(shè)置為 None。有時(shí)這被稱為 接地節(jié)點(diǎn),因此我們使用標(biāo)準(zhǔn)接地符號(hào)表示對(duì) None 的引用,如下圖:
2.2 Unordered List 類
如上所述,無序列表將從一組節(jié)點(diǎn)構(gòu)建,每個(gè)節(jié)點(diǎn)通過顯式引用鏈接到下一個(gè)節(jié)點(diǎn)。只要我們知道在哪里找到第一個(gè)節(jié)點(diǎn)(包含第一個(gè)項(xiàng)),之后的每個(gè)項(xiàng)可以通過連續(xù)跟隨下一個(gè)鏈接找到。考慮到這一點(diǎn),UnorderedList 類必須保持對(duì)第一個(gè)節(jié)點(diǎn)的引用,如下圖所示,實(shí)現(xiàn)代碼如下:
class UnorderedList:
def __init__(self):
self.head = None
def isEmpty(self):
return self.head == None
def add(self,item):
temp = Node(item)
#更改新節(jié)點(diǎn)的下一個(gè)引用以引用舊鏈表的第一個(gè)節(jié)點(diǎn)
temp.setNext(self.head)
#賦值語句設(shè)置列表的頭
self.head = temp
#訪問和賦值的順序不能顛倒,因?yàn)閔ead是鏈表節(jié)點(diǎn)唯一的外部引用,顛倒將導(dǎo)致所有原始節(jié)點(diǎn)丟失并且不能再被訪問
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 必須先將一個(gè)節(jié)點(diǎn)移動(dòng)到 current 的位置。此時(shí),才可以移動(dòng)current
else:
previous = current
current = current.getNext()
#如果要?jiǎng)h除的項(xiàng)目恰好是鏈表中的第一個(gè)項(xiàng),鏈表的 head 需要改變
if previous == None:
self.head = current.getNext()
else:
previous.setNext(current.getNext())
2.2.1 add function
鏈表結(jié)構(gòu)只為我們提供了一個(gè)入口點(diǎn),即鏈表的頭部。所有其他節(jié)點(diǎn)只能通過訪問第一個(gè)節(jié)點(diǎn),然后跟隨下一個(gè)鏈接到達(dá)。這意味著添加新節(jié)點(diǎn)的最簡單的地方就在鏈表的頭部。 換句話說,我們將新項(xiàng)作為鏈表的第一項(xiàng),現(xiàn)有項(xiàng)將需要鏈接到這個(gè)新項(xiàng)后。
2.2.2 鏈表遍歷技術(shù)——size,search,remove方法
size方法實(shí)現(xiàn)思路如下圖:
remove方法實(shí)現(xiàn)思路如下圖:
remove 方法需要兩個(gè)邏輯步驟。
第一步搜索,第二部刪除。
但是current實(shí)際指向的是目標(biāo)節(jié)點(diǎn)的引用,直接刪除會(huì)刪除前一個(gè)節(jié)點(diǎn),因此引入previous這個(gè)外部引用。
參考資料:《problem-solving-with-algorithms-and-data-structure-using-python》
http://www.pythonworks.org/pythonds
總結(jié)
以上是生活随笔為你收集整理的python随机生成无序列表_python实现无序列表:链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 举个栗子!Tableau 技巧(95):
- 下一篇: python用递归方式实现最大公约数_P