鏈表定義:鏈表是由一系列節點組成的元素結合。每一個節點包含兩個部分,數據域item和指向下一個節點的指針next。經過節點之間的相互鏈接,最終串聯成一個鏈表。java
class Node: def __init__(self, item): self.item = item self.next = None # 模擬鏈表 a = Node(1) b = Node(2) c = Node(3) a.next = b b.next = c print(a.next.next.item) # 輸出:3
頭插法是在頭結點這邊插入。node
不光要知道頭還須要知道尾在哪。從尾節點插入。python
class Node: def __init__(self, item): self.item = item # 存放數據 self.next = None # 指針,指向下一個節點 def create_linklist_head(li): """頭插法建立鏈表""" head = Node(li[0]) # 頭節點 for element in li[1:]: # 從第二個到最後一個遍歷列表 node = Node(element) # 實例化爲一個鏈表節點 node.next = head # 設置實例的next屬性指向鏈表頭節點 head = node # 將新加入鏈表節點設置爲頭節點 return head # 要遍歷鏈表須要從頭往回找 def create_linklist_tail(li): """尾插法建立鏈表""" head = Node(li[0]) # 建立頭節點對象 tail = head # 尾節點也是頭節點 for element in li[1:]: # 從第二個到最後一個遍歷列表 node = Node(element) # 建立一個新鏈表節點 tail.next = node # 設置實例next屬性指向鏈表尾節點 tail = node # 將新加入鏈表的節點設置爲尾節點 return head # 返回頭節點,能夠從頭往回找 def print_linklist(lk): """打印鏈表""" while lk: # 只要lk存在 print(lk.item, end=',') # 打印鏈表值 lk = lk.next # 到最後一個節點的時候,lk.next屬性爲空退出循環 lk = create_linklist_head([1, 2, 3]) print(lk) print_linklist(lk) """ <__main__.Node object at 0x10402de48> 3,2,1, """ lk2 = create_linklist_tail([1, 3, 6, 8, 9]) print_linklist(lk2) """ 3,2,1,1,3,6,8,9, """
雙鏈表的每一個節點有兩個指針:一個指向後一個節點,另外一個指向前一個節點。數組
class Node(object): def __init__(self, item): self.item = item # 數據 self.next = None # 指針,指向後一個節點 self.prior = None # 指針,指向前一個節點
#插入 p.next = curNode.next curNode.next.prior = p p.prior = curNode curNode.next = p
代碼過程圖示以下:數據結構
(1)p.next = curNode.next 讓p.next指針指向curNode下一個節點spa
(2)curNode.next.prior = p 讓curNode下一個節點的prior指針指向p設計
(3)p.prior = curNode 讓p的prior指針指向curNode3d
(4)curNode.next = p 讓curNode的next指針指向p指針
#刪除 p = curNode.next curNode.next = p.next p.next.prior = curNode del p
代碼過程圖示以下:視頻
(1)p = curNode.next 指定要刪除的節點是curNode的next指針指向的節點
(2)curNode.next = p.next 修改curNode的next指針指向要刪除節點的next指針指向的節點
(3)p.next.prior = curNode 修改p的next指針指向的節點的prior指針,將指針指向curNode
(4)del p 刪除p
按元素值查找時:都是挨個查看,時間複雜度都爲O(n)
按下標查找時:順序表更快,直接插入到對位位置。鏈表則須要從頭開始數。鏈表時間複雜度是O(n),順序表時間複雜度是O(1)。
在某元素後插入:這種狀況順序表是O(n),插入後,後面的元素都須要日後挪。鏈表則是O(1)。
刪除某元素:這種狀況順序表是O(n),刪除後,後面的元素都須要往前挪。鏈表則是O(1)。
鏈表在插入和刪除操做上明顯快於順序表。
鏈表的內存能夠更靈活的分配。java等的數組一開始申請的空間若是滿了是沒有辦法解決的,python的列表在一開始申請的空間不足時,也是經過從新申請新的空間,將原來內存空間的內容拷貝進去。
能夠嘗試利用鏈表從新實現棧和隊列,使用棧實現隊列就不用考慮隊滿的問題,也不用設計爲環形。
鏈表這種鏈式存儲的數據結構對樹和圖的結構有很大的啓發性。