python鍊錶指標的理解 python描述 鍊錶

2021-10-11 15:03:41 字數 4712 閱讀 4181

單鏈表結構:

鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。對於python來說指標就是指向下乙個物件。

單鏈表時間複雜度:

建立空表:o(1)

刪除表:o(1)

判斷空:o(1)

加入:首端加入:o(1)

尾端加入:o(n)

定位加入:o(n)

刪除:首端刪除:o(1)

尾端刪除:o(n)

定位刪除:o(n)

其他刪除:o(n)

掃瞄定位遍歷都需要價差一批表節點,其時間複雜度收到節點數約束。

單鏈表 實現:

1 class linkedlistunderflow(valueerror): #自定義鍊錶為空異常類

2 pass

4 classlnode(object):5 def __init__(self,ele,next=none):6 self.ele =ele7 self.next =next8

10 classdlist(object):11 def __init__(self):12 self.head =none13

14 def is_emtpy(self): #鍊錶是否為空

15 if self.head ==none:16

17 returntrue18

20 p = lnode(ele=ele)21

22 ifself.is_emtpy():23 self.head =p24 return

26 last_p =self.head27 while last_p.next: #找到尾部後插入

28 last_p =last_p.next29 last_p.next =p30

32 p = lnode(ele=ele)33

34 ifself.is_emtpy():35 self.head =p36 return

38 p.next =self.head39 self.head =p40

41 defhead_pop(self):42 ifself.is_emtpy():43 raise linkedlistunderflow("鍊錶為空")44

45 if self.head.next == none: #只有乙個節點

46 self.head =none47 return

49 self.head =self.head.next50

51 deflast_pop(self):52 ifself.is_emtpy():53 raise linkedlistunderflow("鍊錶為空")54

55 if self.head.next == none: #只有乙個節點

56 self.head =none57 return

59 p =self.head60 while p.next.next: #找到倒數第二個節點

61 p =p.next62 p.next =none63

65 def print_all(self): #輸出所有元素

66 ifself.is_emtpy():67 print("鍊錶為空")68 return

70 last_p =self.head71 whilelast_p:72 print(last_p.ele)73 last_p = last_p.next

單鏈表迴圈單鏈表:

python中的迴圈單鏈表,實際就是尾部(tail)節點的指標指向head物件。所以迴圈單鏈表實現中只需要實現self.tail而頭部即為self.tail.next,以此形成迴圈進行節點操作。

迴圈單鏈表實現

1 classloodlist(object):2 def __init__(self):3 self._real =none4

5 defis_emtpy(self):6 return self._real isnone7

11 ifself.is_emtpy():12 self._real =p13 p.next = self._real #建立乙個列表迴圈

14 return

16 p.next = self._real.next #在首部新增新節點

17 self._real.next =p18

23 def pop(self): #前端彈出

24 ifself.is_emtpy():25 raise linkedlistunderflow("鍊錶為空")26

27 if self._real.next == self._real: #只有乙個節點

28 print(self._real.ele)29 self._real =none30 return

32 value =self._real.next.ele33 self._real.next = self._real.next.next #彈出前端節點,尾部指標指向彈出節點的next物件

34 returnvalue35

36 defprint_all(self):37 ifself.is_emtpy():38 return

40 p =self._real.next41 whiletrue:42 print(p.ele)43 if p isself._real:44 break

45 p = p.next

view code

雙向鍊錶:

雙向鍊錶實現:

#雙向鍊錶

classdelement(object):def __init__(self,ele,next=none,pre=none):

self.ele=ele

self.next=next

self.pre=preclassbllist(object):def __init__(self):

self.head=none

self.real=nonedef empty(self): #清空鍊錶

self.head =none

p = delement(ele=ele,next=self.head)if not self.head: #鍊錶為空

self.head =p

self.real=preturnself.head.pre=p

p = delement(ele=ele,pre=self.real)if notself.real:

self.head=p

self.real=preturnself.real.next=p

self.real=pdef head_pop(self): #前端刪除

if notself.head:raise valueerror("列表為空")

value=self.head.eleif self.head == self.real: #只有乙個元素清空

self.empty()returnvalue

self.head=self.head.next

self.head.pre=nonereturnvaluedeflast_pop(self):if notself.real:raise valueerror("列表為空")

value=self.real.eleif self.head ==self.real:

self.empty()returnvalue

self.real=self.real.pre

self.real.next=nonereturnvaluedef printall(self): #輸出所有元素值

p =self.headwhile p !=self.real:print(p.ele)

p=p.nextif p: #鍊錶是否為空

print(p.ele)

view code

鍊錶反轉

原理:原鍊錶相當於一摞書,將這摞書最上面的一本拿下來 放在乙個位置b, 再拿一本再放在位置b的最上面,重複這個過程。

class lnode(object):

def __init__(self, ele, next=none):

self.next = next

self.ele = ele

class dlist(object):

def __init__(self):

self.head = none

p = lnode(ele=ele)

if not self.head:

self.head = p

return

p.next = self.head

self.head = p

def reverse(self):

q = none #新鍊錶

while true: #從原煉表中拿到乙個元素放入新鍊錶

p = self.head #剔除原鍊錶最上方的元素

self.head = self.head.next

if p == none: #原鍊錶沒元素了

break

p.next = q #將剔除元素放入新的鍊錶

q = p

self.head = q #將反轉的鍊錶給原鍊錶

def printall(self):

p = self.head

while p != none:

print(p.ele)

p = p.next

a = dlist()

for i in range(10):

a.reverse()

a.printall()

關於鍊錶 指標 變數的理解

是乙個整體,它是用於指向結構體 c 中的class等含有子資料的指標用來取子資料。換種說法,如果我們在c語言中定義了乙個結構體,然後申明乙個指標指向這個結構體,那麼我們要用指標取出結構體中的資料,就要用到 舉個例子 struct data 定義結構體 struct data p 定義結構體指標 st...

鍊錶的理解

鍊錶的理解 開發工具與關鍵技術 visual studio c 鍊錶,通過這段時間對鍊錶的理解。最終有了個人的理解。我對鍊錶的理解呢,就是乙個節點乙個節點連線起來的。節點由我們的資料結構構成,我們可以用 struct,class 去建立節點。開始的時候我也有嘗試著去用 union 去做連表,但是得出...

關於鍊錶中頭指標和頭結點的理解

線性表使用順序 陣列 儲存時有個弊端,那就是在插入和刪除時需要大量的移動資料,這顯示是非常消耗時間的,所以可以採用鏈式儲存,即有乙個指標域 單鏈表 來記錄下個結點的儲存位置 位址 這樣在插入和刪除結點時只需要修改指標域即可,從而大量減少移動資料所消耗的時間。來看鍊錶的定義 struct node 其...