Python 鏈表(linked list)


鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的
鏈表由一系列結點組成,結點可以在運行時動態生成

優點

由於不必須按順序存儲,鏈表在插入、刪除的時候可以達到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM