連結串列是一系列資料元素,通過連結連線在一起。 每個資料元素都以指標的形式包含到另一個資料元素的連線。 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