Python鏈表

鏈表是一系列數據元素,通過鏈接連接在一起。 每個數據元素都以指針的形式包含到另一個數據元素的連接。 Python在其標準庫中沒有鏈接列表。 我們使用前一章討論的節點概念來實現鏈表的概念。 我們已經知道如何創建節點類以及如何遍歷節點的元素。 在本章中,將學習鏈表的類型:單鏈表。 在這種類型的數據結構中,任何兩個數據元素之間只有一個鏈接。 創建一個鏈表並使用一些方法來插入,更新和從列表中移除元素。

創建鏈表

通過使用在上一章中學習的節點類來創建鏈表。創建一個Node對象並創建另一個類來使用這個節點對象。 通過節點對象傳遞適當的值來指向下一個數據元素。 下面的程序使用三個數據元素創建鏈接列表。 在下一節中,將學習如何遍歷鏈表。

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

list1 = SLinkedList()
list1.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
# Link first Node to second node
list1.headval.nextval = e2

# Link second Node to third node
e2.nextval = e3

遍歷鏈表

從第一個數據元素開始,單向鏈表只能在向前遍歷。 只需通過將下一個節點的指針指向當前數據元素來打印下一個數據元素的值。

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

# Link first Node to second node
list.headval.nextval = e2

# Link second Node to third node
e2.nextval = e3

list.listprint()

執行上面示例代碼,得到以下結果 -

Mon
Tue
Wed

向鏈表插入數據

在鏈表中插入元素涉及將指針從現有節點重新分配給新插入的節點。 取決於新數據元素是在鏈表的開始位置還是在中間位置或末尾插入,有以下解決方案。

在鏈接列表的開頭插入

這涉及到將新數據節點的下一個指針指向鏈表的當前頭部。 因此,鏈表的當前頭成爲第二個數據元素,新節點成爲鏈表的頭部。

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

# Print the linked list
    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval
    def AtBegining(self,newdata):
        NewNode = Node(newdata)

# Update the new nodes next val to existing node
        NewNode.nextval = self.headval
        self.headval = NewNode

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

list.headval.nextval = e2
e2.nextval = e3

list.AtBegining("Sun")

list.listprint()

執行上面示例代碼,得到以下結果 -

Sun
Mon
Tue
Wed

在鏈表的末尾插入

這包括將鏈表的當前最後一個節點的下一個指針指向新的數據節點。 因此鏈表的當前最後一個節點成爲倒數第二個數據節點,新節點成爲鏈表的最後一個節點。參考以下代碼實現 -

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

# Function to add newnode
    def AtEnd(self, newdata):
        NewNode = Node(newdata)
        if self.headval is None:
            self.headval = NewNode
            return
        laste = self.headval
        while(laste.nextval):
            laste = laste.nextval
        laste.nextval=NewNode

# Print the linked list
    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval


list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

list.headval.nextval = e2
e2.nextval = e3

list.AtEnd("Thu")

list.listprint()

執行上面代碼,得到以下結果 -

Mon
Tue
Wed
Thu

在兩個數據節點之間插入

這涉及到將指定節點的指針指向新節點。 這可以通過傳入新節點和現有節點,然後插入新節點。 所以定義一個額外的類,將新節點的下一個指針改變爲中間節點的下一個指針。 然後將新節點分配給中間節點的下一個指針。參考以下代碼實現 -

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

# Function to add node
    def Inbetween(self,middle_node,newdata):
        if middle_node is None:
            print("The mentioned node is absent")
            return

        NewNode = Node(newdata)
        NewNode.nextval = middle_node.nextval
        middle_node.nextval = NewNode

# Print the linked list
    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval


list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Thu")

list.headval.nextval = e2
e2.nextval = e3

list.Inbetween(list.headval.nextval,"Fri")

list.listprint()

執行上面示例代碼,得到以下結果 -

Mon
Tue
Fri
Thu

從鏈表中刪除項目

可以使用該節點的鍵來刪除一個節點。 在下面的程序中,找到要刪除的節點的前一個節點。 然後將該節點的下一個指針指向要刪除的節點的下一個節點。

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

class SLinkedList:
    def __init__(self):
        self.head = None

    def Atbegining(self, data_in):
        NewNode = Node(data_in)
        NewNode.next = self.head
        self.head = NewNode

# Function to remove node
    def RemoveNode(self, Removekey):

        HeadVal = self.head

        if (HeadVal is not None):
            if (HeadVal.data == Removekey):
                self.head = HeadVal.next
                HeadVal = None
                return

        while (HeadVal is not None):
            if HeadVal.data == Removekey:
                break
            prev = HeadVal
            HeadVal = HeadVal.next

        if (HeadVal == None):
            return

        prev.next = HeadVal.next

        HeadVal = None

    def LListprint(self):
        printval = self.head
        while (printval):
            print(printval.data),
            printval = printval.next


llist = SLinkedList()
llist.Atbegining("Mon")
llist.Atbegining("Tue")
llist.Atbegining("Wed")
llist.Atbegining("Thu")
llist.RemoveNode("Tue")
llist.LListprint()

執行上面示例代碼,得到以下結果 -

Thu
Wed
Mon