資料結構 Python實現 之鍊錶

2021-08-28 21:22:10 字數 3008 閱讀 7711

理解資料結構最好的方式就是用腦洞把它想象出來。

一、節點

class node():

def __init__(self,data=none):

self.data=data

self.left=none

self.right=none

node = node(5)

現在請你閉眼在腦海創造一片虛無縹緲的空間,空間裡產生乙個盒子,盒子攜帶了三個屬性,其中乙個資料攜帶了資料5,另外兩個屬性暫時是空的。沒錯,這就是乙個節點,它是鍊錶的基礎單位,一會我們將用創造很多這樣的盒子組合出很多強大的功能。現在先釋放掉你的想象,讓盒子湮滅於時空中,一會用到的時候我們可以隨時創造。

二、鍊錶類

class link():

def __init__(self):

self.root=none

如你所見,這個鍊錶類除了self.root指向了乙個none,還不能做任何事。我們先來建立乙個例項link=link()。你可以把這個例項想象為乙個綠點,當然你也可以把它想象成綠色的長方形,隨你喜歡。下面我們為鍊錶類新增一些方法。

三、增加元素

你腦子裡的小宇宙中應該有乙個紅色的點,孤零零的飄盪。我們再創造乙個節點,就是前面提到的盒子,盒子的資料屬性(self.data)為5。現在讓紅點的self.root指向這個節點。鍊錶物件用乙個箭頭束縛了這個節點,它們倆愉快的被這條線綁起來了。

**是這樣的。

現在我們的link物件擁有乙個節點了。我們可以通過link.root.data訪問到資料5。我們繼續嘗試新增第二個節點,你會發現存在一些問題。現在請用你的腦洞再創造乙個節點盒子,其資料為6。我們呼叫addhead方法,self.root指向了新的盒子,此時舊盒子被拋棄了。這顯然不是我們想要的,我們想讓節點們形成一條鏈,而不是顧此失彼。

我們稍微修改一下,使它們連成一條,而不是分開。

首先我們新建了乙個節點,舊節點的left屬性首先連線了新節點的位置,新節點的right屬性又連線了舊節點的位置,link物件的root屬性不再連線舊節點而是重新連線了新節點的位置。這樣,經過幾步操作,我們得到了如圖所示的結構。這種方法就是鍊錶中的頭插法。我們可以用這種方法插入無數個節點,直到耗盡計算機記憶體。

四、定位節點

假設我們已經用上面的方法插入了10000個節點,我們怎麼把它們讀出來呢?第乙個資料,當然是link.root.data,第二個資料,link.root.right.data,第三個資料,link.root.right.right.data,同理,第10000個資料,link.root.right(省略9998個.right)......data就可以拿到第10000個資料了。這樣的方法顯然是有點麻煩的,為了不被老闆開除,我們需要乙個通用的方法。思路是這樣的,我們定位乙個節點,得到right屬性,通過right定位下乙個節點,以此迴圈直到right為none或者符合我們的要求。我們下面寫乙個定位節點位置的方法。這個方面我們後面會多次用到。

def find_node(self,n):

# 鍊錶不為空時,開始後面的操作

if self.root:

# 定位第乙個節點

temp=self.root

# 如果傳入了-1,這裡我們認為是查詢最後乙個節點

if n==-1:

while true:

# 如果right不為空,我們會一直把right賦值為temp,直到......

if temp.right:

temp=temp.right

# 直到right已經為空了,說明我們到達了鍊錶的最後乙個節點

# 這時候我們可以把temp返回給呼叫者了,呼叫者會對這個節點做一些事情

# 具體拿來做什麼事情,不是這個方法所關心的

else:

return temp

else:

# 如果呼叫者沒有傳入-1,我們認為呼叫者希望找到第n個節點

i=0# i在下面會累加,直到找到第n個節點

while i我們成功定位了第n個節點!現在你能想通尾插法和中間插法的邏輯嗎?

五、尾插法

def addend(self,data):

# 新建乙個節點

node=node(data)

# 如果link不為空,進行下面的操作

if self.root:

# 找到最後乙個節點

temp=self.find_node(-1)

# 如果查詢成功時...

if temp:

# 原來的最後節點的right連線新節點

temp.right=node

# 新節點的left連線原來的最後節點

node.left=temp

# 如果查詢失敗,也就無從下手,直接返回失敗標誌

else:

return none

# 如果鍊錶為空,直接讓link連線新節點就行了

else:

self.root=node

今天先寫到這裡,不知道這樣寫能不能讓人理解清楚。如果可以幫到你,請告訴我,我會繼續更新其他的方法。

資料結構之鍊錶(python實現)

coding utf 8 create on 2020 8 20 20 17 filename lianbiao.py 以單鏈表為例 建立鍊錶 定義節點 class node def init self,data none next none self.data data self.next nex...

資料結構 鍊錶(Python實現)

鍊錶這個資料結構在我們做題時非常常見,鍊錶上的每乙個元素都包含了兩個值,乙個值是自身的值,另外乙個值則是指向下乙個元素的位址,這樣一整個鍊錶才能夠串連起來。如下所示 其中第乙個為單鏈表,每乙個元素都指向了下乙個元素,最後乙個元素指向了none。那麼我們如何使用python來實現乙個最基本的單鏈表呢?...

python資料結構之鍊錶

鍊錶 linked list 由於python是動態語言,可以直接把物件賦值給新的變數,於是在python一切皆為物件的原理上實現鍊錶的各項操作。在實現鍊錶python類的屬性和方法操作之前,先整理一些鍊錶的理論知識。一 鍊錶的基本結構鍊錶是通過乙個個節點 node 組成的,每個節點都包含了稱為資料...