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