Linked Lists
链表是一系列数据元素,它们通过链接连接在一起。 每个数据元素包含以指针形式与另一个数据元素的连接。 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
插入链接列表
在链表中插入元素涉及将指针从现有节点重新分配给新插入的节点。 根据新数据元素是在链表的开头还是中间或末尾插入,我们有以下方案。
在链接列表的开头插入
这涉及将新数据节点的下一个指针指向链表的当前头部。 因此,链表的当前头部成为第二个数据元素,新节点成为链表的头部。
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