- Python 資料結構與演算法教程
- Python - 資料結構主頁
- Python - 資料結構介紹
- Python - 資料結構環境
- Python - 陣列
- Python - 列表
- Python - 元組
- Python - 字典
- Python - 二維陣列
- Python - 矩陣
- Python - 集合
- Python - 對映
- Python - 連結串列
- Python - 棧
- Python - 佇列
- Python - 雙端佇列
- Python - 高階連結串列
- Python - 雜湊表
- Python - 二叉樹
- Python - 搜尋樹
- Python - 堆
- Python - 圖
- Python - 演算法設計
- Python - 分治法
- Python - 遞迴
- Python - 回溯法
- Python - 排序演算法
- Python - 搜尋演算法
- Python - 圖演算法
- Python - 演算法分析
- Python - 大O記號
- Python - 演算法分類
- Python - 均攤分析
- Python - 演算法論證
- Python 資料結構與演算法有用資源
- Python - 快速指南
- Python - 有用資源
- Python - 討論
Python - 連結串列
連結串列是由資料元素組成的序列,這些資料元素透過連結連線在一起。每個資料元素都包含指向另一個數據元素的指標。Python 的標準庫中沒有連結串列。我們使用前面章節中討論的節點的概念來實現連結串列的概念。
我們已經瞭解瞭如何建立節點類以及如何遍歷節點的元素。在本節中,我們將學習稱為單鏈表的連結串列型別。在這種資料結構中,任何兩個資料元素之間只有一個連結。我們建立這樣一個列表,並建立附加方法來插入、更新和刪除列表中的元素。
連結串列的建立
連結串列是使用我們在上一章學習的節點類建立的。我們建立一個 Node 物件,並建立另一個類來使用此 ode 物件。我們透過節點物件傳遞適當的值以指向下一個資料元素。下面的程式建立了包含三個資料元素的連結串列。在下一節中,我們將看到如何遍歷連結串列。
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
在連結串列中插入
在連結串列中插入元素涉及重新分配現有節點到新插入節點的指標。根據新資料元素是在連結串列的開頭、中間還是結尾插入,我們有以下幾種情況。
在開頭插入
這涉及將新資料節點的 next 指標指向連結串列的當前頭部。因此,連結串列的當前頭部成為第二個資料元素,而新節點成為連結串列的頭部。
示例
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
在結尾插入
這涉及將連結串列當前最後一個節點的 next 指標指向新資料節點。因此,連結串列的當前最後一個節點成為倒數第二個資料節點,而新節點成為連結串列的最後一個節點。
示例
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
在兩個資料節點之間插入
這涉及更改特定節點的指標以指向新節點。可以透過同時傳入新節點和現有節點(新節點將在其之後插入)來實現。因此,我們定義一個附加類,該類將更改新節點的 next 指標到中間節點的 next 指標。然後將新節點賦值給中間節點的 next 指標。
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
刪除項
我們可以使用該節點的鍵刪除現有節點。在下面的程式中,我們找到要刪除的節點的前一個節點。然後,將此節點的 next 指標指向要刪除節點的下一個節點。
示例
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