python链表的基础概念和基础用法详解
本文为大家分享了python链表的基础概念和基础用法,供大家参考,具体内容如下
一、什么是链表
链表是由多个不同的节点组成,每个节点通过指针区域关联到一起
链表的头指针,指向了头节点,通过头指针可以找到其他节点信息
文章图片
二、什么是节点
【python链表的基础概念和基础用法详解】链表由节点组成,每个节点又包含两个部分,一个是元素区域,一个是指针区域。
元素区域存储的是,当前节点的数值,指针区域指向下一个节点的对象。在C语言中,指针应该是指向下一个元素的的内存地址,因python中不研究指针,这里用下一个节点的对象代替。这样我们就能通过指针区域,找到下一个节点的信息,从而得到下一个节点的值了。
文章图片
三、为什么引入链表的概念
1.先说说数组这种数据结构吧,数组是一块大的连续内存空间。每次初始化需要开辟一大块内存空间,空间利用率比较低。而链表则不同,链表的节点可以随机分布在任何位置,只需通过指针穿引起来即可。
2.在连续的内存空间中,插入一个元素时,所有其他元素的位置也变动了。插入元素、删除元素时候,效率比较低。
链表是非连续的内存空间,每个节点单独存在自己的内存空间,通过指针指向下一个节点。
如果在某个地方插入一个节点,只需要改变指针的指向即可,不用其他元素都变动。
四、链表的基本操作
# 实现头部插入 尾部插入 根据索引插入 删除节点并print 打印# 定义一个节点class Node:def __init__(self, data):self.data = https://www.it610.com/article/dataself.next = Noneclass SingleLinkList:def __init__(self):self.head = Noneself.tail = Nonedef is_empty(self):"""链表是否为空:return:"""return self.head is Nonedef length(self):"""求当前链表的长度:return:"""count = 0cur = self.headwhile cur is not None:count += 1cur = cur.nextreturn countdef insert_head_node(self, data):"""链表头部添加元素:param data: 要保存的数据:return:"""node = Node(data)node.next = self.headself.head = nodedef append_node(self, data):"""链表尾部添加元素,有多种实现方式:param data::return:"""# 第一种方式时间复杂度为O(n)的处理方式node = Node(data)# 如果链表为空,需要特殊处理if self.is_empty():self.head = nodeelse:cur = self.headwhile cur.next is not None:cur = cur.next# 退出循环时, cur指向尾节点cur.next = node# 第二种 引入一个tail指针 默认当前链表为一个空链表,不停的去append节点# node = Node(data)# if self.is_empty():# 当第一次添加节点到空链表中的时候,头指针和尾指针同时指向新节点#self.head = node#self.tail = node# else:# 当再次添加节点到链表中的时候, 头指针始终指向头节点,尾指针始终执行未节点,如果一直向未节点追加节点,只需移动tail指针即可#self.tail.next = node#self.tail = nodedef insert_node(self, pos, data):"""指定位置添加元素:param pos::param data::return:"""# 1, 在头部添加if pos <= 0:self.insert_head_node(data)# 2, 在尾部添加elif self.length() >= pos:self.append_node(data)# 3, 指定位置添加else:count = 0while count < (pos - 2):count += 1self.head = self.head.next# 这时候self.head 表示当前插入前一个节点# self.head.next 表示当前插入的后一个节点node = Node(data)self.head.next = nodenode.next = self.head.nextdef delete_node(self, data):"""删除节点:param data::return:"""cur = self.head# 记录当前节点的位置pre = None# 记录当前节点位置的前置节点while cur is not None:# 找到了要删除的元素if cur.data == data:# 在头部找到了要删除的元素if cur == self.head:self.head = cur.nextreturn Trueelse:pre.next = cur.nextreturn Trueelse:# 不是要找的元素, 移动光标pre = curcur = cur.nextdef search_node(self, data):"""查找节点是否存在:return:"""cur = self.headwhile cur is not None:if cur.data == data:return Truecur = cur.nextreturn Falsedef reveres_node(self):"""链表反转:return:"""if self.is_empty():returnj = 0while j < self.length() - 1:cur = self.headfor i in range(self.length() - 1):cur = cur.nextif cur.next is None:x = cur.dataself.delete_node(cur.data)self.insert_node(j, x)j += 1return self.head
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
- VGG16模型的复现及其详解(包含如何预测)
- Tkinter|Tkinter 组件Scrollbar的具体使用
- Java实现图片裁剪功能的示例详解
- Android 的GlideTabLayoutRecyclerView(下一章补充)。
- Android 获取 View 宽高的常用正确方式,避免为零
- Mac上查看当前安卓手机上打开的app的包名和主程序入口
- Android为按钮添加相应事件的代码
- {调取该文章的TAG关键词}|今年一季度股权融资额腰斩过半 | 钛媒体创投季报
- Rails的会话介绍和用法