1. 程式人生 > >Python實現基礎資料結構--單向連結串列

Python實現基礎資料結構--單向連結串列

連結串列

*CSDN不支援mermaid語法,所以圖在該網站就看不到了

節點類

連結串列的基礎是節點,先宣告節點類:

class Node(object):
    def __init__(self, data, nextNode = None):
        self.data = data
        self.nextNode = nextNode

連結串列類

連結串列的初始變數是頭節點,為空。

class LinkList(object):
    def __init__(self, head = None):
        self.head = head

對連結串列的操作包括插入節點,刪除節點,遍歷結點並輸出和連結串列反轉

插入節點

#插入結點函式:引數明確要插入的結點和插入的位置
def insert(self, node, index):
    if self.head == None:
        self.head = node
        return
    if index == 0:
        node.nextNode = self.head
        self.head = node
        return
    currentNode = self.head
    count = 0
# 當前節點後移 while currentNode.nextNode != None and count < index-1: currentNode = currentNode.nextNode count+=1 # 插入節點的下一節點時當前節點的下一節點,當前節點的下一節點變成插入節點 if count == index-1: node.nextNode = currentNode.nextNode currentNode.nextNode = node
graph LR;
    A((a))-->B((b));
    B((b))-.->C
((c)); C((c))-->D((d)); B((b))-->|nextNode|E((e)) E((e))-->|nextNode|C((c))

刪除節點

#刪除節點函式:引數標識刪除的節點位置
def delete_node(self, index):
    if self.head == None:
        return
    currentNode = self.head
    count = 0
    if index == 0:
        self.head = None
        return
    # 當前節點後移
    while currentNode.nextNode != None and count < index-1:
        currentNode = currentNode.nextNode
        count+=1
    # 暫存被刪節點(當前節點的下一節點),當前節點的下一節點變成被刪節點的下一節點
    if count == index-1:
        deleteNode = currentNode.nextNode
        currentNode.nextNode = deleteNode.nextNode
graph LR;
    A((a))-->B((b));
    B((b))-.->C((c));
    C((c))-.->D((d));


    style C fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 5, 5

反轉連結串列

#反轉連結串列函式
def reverse(self):
    if self.head == None:
        return
    currentNode = self.head.nextNode
    self.head.nextNode = None
    while currentNode != None:
        nextNode = currentNode.nextNode #暫存當前節點下一節點為下一節點
        currentNode.nextNode = self.head #暫存頭節點為當前節點下一節點
        self.head = currentNode #頭節點變成當前節點
        currentNode = nextNode  # 下一節點變成當前節點
graph LR;
    A((head))-.->B((b:cn));
    A((head))-->|nextNode|E((None));
    B((b:cn))-->|nextNode|C((c:nn->cn));
    B((b:cn->head))-->A((head));
    C((c:nn->cn))-->D((d))
graph LR;
    B((b:head->x))-.->C((c:cn));
    C((c:cn->head))-->|nextNode|B((b));
    C((c:cn->head))-->|nextNode|D((d));
    D((d:nn->cn))-->E((e));

遍歷節點

#遍歷節點函式:輸出所有節點資料
def output(self):
    if self.head == None:
        return
    currentNode = self.head
    while currentNode != None:
        print(currentNode.data,'--> ',end = "")
        currentNode = currentNode.nextNode
    print("")