鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的
鏈表由一系列結點組成,結點可以在運行時動態生成
優點
由於不必須按順序存儲,鏈表在插入、刪除的時候可以達到O(1)的復雜度,比線性表快得多
缺點
相比於線性表順序結構操作復雜,查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而線性表和順序表相應的時間復雜度分別是O(logn)和O(1)
分類
單向鏈表
單向鏈表的鏈接方向是單向的,對鏈表的訪問要從頭部開始順序讀取
組成
每個結點包括兩個部分:
是存儲數據元素的數據域,
存儲下一個結點地址的指針域
示例:
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
操作
- 遍歷
- 插入、刪除
- 建立
- 頭插法
- 尾插法
class Node(object):
def __init__(self, item=None):
self.item = item
self.next = None
def traversal(head_node):
"""鏈表的遍歷"""
cur_node = head_node
while cur_node is not None:
print(cur_node.item)
cur_node = cur_node.next
def add(value, cur_node):
"""鏈表的插入,在當前節點之后插入新的節點"""
new_node = Node(value)
new_node.next, cur_node.next = cur_node.next, new_node
def delete(cur_node):
"""鏈表的刪除,刪除當前節點之后的節點"""
tar_node = cur_node.next
cur_node.next = cur_node.next.next
del tar_node
def create_linklist_f(li):
"""頭插法建立鏈表"""
head = Node()
for num in li:
temp = Node(num)
temp.next, head.next = head.next, temp
return head
def create_linklist_r(li):
"""尾插法建立鏈表"""
head = Node()
r_node = head
for num in li:
temp = Node(num)
r_node.next, temp.next = temp, None
r_node = r_node.next
return head
雙向鏈表
雙向鏈表每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅,所以從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點
組成
每個結點包括兩個部分:
是存儲數據元素的數據域,
存儲下一個結點地址的指針域
示例:
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
循環鏈表
表中最后一個結點的指針域指向頭結點,整個鏈表形成一個環
組成
每個結點包括兩個部分:
是存儲數據元素的數據域,
存儲下一個結點地址的指針域
示例:
class Node(object):
def __init__(self, item):
self.item = item
self.next = None