- 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