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
Python遍历链表
从第一个数据项开始,后面不能传递单个链表。只需指定当前数据项的下一个节点索引即可打印下一个数据项的值。
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()
Python运行上面的示例代码,得到以下结果 -
Mon
Tue
Wed
Shell将数据插入链表
从新引入的非链表节点插入元素。根据新数据项是插入链表的开头、中间还是结尾,存在以下解决方案。
在链接列表的开头输入
。因此,链表的当前头成为第二个数据元素,新节点成为链表的头。
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()
Python运行上面的示例代码,得到以下结果 -
Sun
Mon
Tue
Wed
Python将
添加到链表末尾。这涉及将链表中最后一个节点的下一个指针指向新的数据节点。因此,链表中的最后一个节点成为链表中的最后一个节点,新节点成为链表中的最后一个节点。参见以下代码实现 -
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()
Python执行上述代码,得到以下结果 -
Mon
Tue
Wed
Thu
Shell在两个数据节点之间插入
。这涉及将指定节点的指针指向新节点。这可以通过发送新节点和现有节点,然后添加新节点来完成。所以我们定义了一个额外的类,将新节点的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()
Python运行上面的示例代码,得到以下结果 -
Mon
Tue
Fri
Thu
Shell从链接列表中删除项目
可以删除节点 a 节点。在以下程序中,找到要删除的节点的前一个节点。然后,将该节点旁边的指针指向要删除的节点的旁边的节点。
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()
Python运行上面的示例代码,得到以下结果 -
Thu
Wed
Mon
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网