數據結構——線性結構(鏈表)

  鏈表定義:鏈表是由一系列節點組成的元素結合。每一個節點包含兩個部分,數據域item指向下一個節點的指針next。經過節點之間的相互鏈接,最終串聯成一個鏈表。java

1、單鏈表

  

一、節點定義

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

二、創建鏈表

(1)頭插法

  頭插法是在頭結點這邊插入。node

  

(2)尾插法

  不光要知道頭還須要知道尾在哪。從尾節點插入。python

  

(3)代碼實現 

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,
"""

三、鏈表的遍歷

  

四、鏈表節點的插入和刪除(視頻缺,須要補)

 

2、雙鏈表

  雙鏈表的每一個節點有兩個指針:一個指向後一個節點,另外一個指向前一個節點。數組

  

一、節點定義

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

3、鏈表總結

一、順序表(列表)與 鏈表複雜度對比分析

  按元素值查找時:都是挨個查看,時間複雜度都爲O(n)

  按下標查找時:順序表更快,直接插入到對位位置。鏈表則須要從頭開始數。鏈表時間複雜度是O(n),順序表時間複雜度是O(1)。

  在某元素後插入:這種狀況順序表是O(n),插入後,後面的元素都須要日後挪。鏈表則是O(1)。

  刪除某元素:這種狀況順序表是O(n),刪除後,後面的元素都須要往前挪。鏈表則是O(1)。

二、鏈表和順序表對比總結

  鏈表在插入和刪除操做上明顯快於順序表

  鏈表的內存能夠更靈活的分配。java等的數組一開始申請的空間若是滿了是沒有辦法解決的,python的列表在一開始申請的空間不足時,也是經過從新申請新的空間,將原來內存空間的內容拷貝進去。

    能夠嘗試利用鏈表從新實現棧和隊列,使用棧實現隊列就不用考慮隊滿的問題,也不用設計爲環形。

  鏈表這種鏈式存儲的數據結構對樹和圖的結構有很大的啓發性。

相關文章
相關標籤/搜索