使用python实现链表操作
作者:黑加仑妞 发布时间:2021-07-29 23:30:38
一、概念梳理
链表是计算机科学里面应用应用最广泛的数据结构之一。它是最简单的数据结构之一,同时也是比较高阶的数据结构(例如棧、环形缓冲和队列)
简单的说,一个列表就是单数据通过索引集合在一起。在C里面这叫做指针。比方说,一个数据元素可以由地址元素,地理元素、路由信息活着交易细节等等组成。但是链表里面的元素类型都是一样的,是一种特殊的列表。
一个单独的列表元素叫做一个节点。这些节点不像数组一样都按顺序存储在内存当中,相反,你可以通过一个节点指向另外一个节点的指针在内存不同的地方找到这些元素。列表最后一项习惯用NIL表示,相当于python里面的None
这里介绍两种不同的列表——单链表和双链表。双链表中的某个节点只会指向列表中的下一个元素,但是在双链表里面,当前节点同时也会指向前一个节点。所以双链表会占用更多的内存,因为它需要额外的变量去存储索引
图一、单链表
图2:双链表
单链表可以从头到尾顺序查询,但是反过来就不是那么容易了。然而,双链表不管你是从哪个节点开始,从任意方向查询都是一样的。在单链表中增加和删除节点只需要两步,但是在双链表里就需要四步了。
但是在python里面没有提供像双链表一样的数据结构,所以我们可以自己创建一个这样的数据结构
二、如果使用python创建链表
(1).将节点定义成一个数据结构
首先我们将节点类定义成ListNode,该类在初始化实例对象时,定义了两个实例变量,其中data用来存储节点的值,next用来存储下一个节点的索引,下面详细介绍一下一个节点要定义的方法和属性
__init__():初始化节点
self.data:存储节点的值
self.next:存储指向下一个节点的索引
has_value():将当前节点值和其他的值比较
上面的方法和属性涵盖了一个节点应有的基本属性和行为
Listing1:The ListNode class
上面创建了最简单的节点类,下面初始化ListNode的对象
Listing2:初始化节点
上面创建了三个独立的节点
(2)创建一个单链表类
现在我们定义一个名为SingleLinkedList的类去管理我们的节点,它包含了下面这些方法:
__init__():初始化对象
list_length():返回节点数量
output_list():输出节点值
add_list_item():在列表末尾增加一个新的节点
unordered_search():根据一个特殊值去查询列表
remove_list_item_by_id():根据节点id移除节点
下面一一讲解这些方法
__init__()定义了head和tail,都初始化为None
Listing3:The SingleLinkedList class(part one)
(3)、添加节点
通过add_list_item()添加列表元素。先检测是不是ListNode的实例,如果不是,就新建一个节点。如果列表还是空的话,就把该节点当作头节点,如果不是空,就将当前节点指向下一个元素(也就是刚新添加的节点)。把新节点添加到列表当中
Listing4:The SinglelinkedList class(part two)
list_length()方法计算节点数量,返回列表的长度。在一个循环当中循环列表,self.next依次指向下一个节点
Listing5:The SingleLinkedList class(part three)
output_list()用来输出新的节点值
Listing6:The SingleLinkedList class(part four)
下面我们初始化SingleLinkedList的实例track,然后创建4个节点。
(4)查询列表
查询整个列表使用unordered_search()。它需要使用一个额外的参数帮助查询。列表的头是切入点。
(5)、从列表中移除一个元素
从列表中移除一个节点 时,指向该节点索引需要被移动到,被移除节点的下一个节点。被移除的节点会由python的垃圾回收机制清除
Listing10:Removing a node by node number
(6)、创建一个双链表
创建双链表其实就是在ListNode的基础上,在创建一个previous的属性
Listing11:Extended list node class
然后我们就可以依据上面的定义新建一个双链表类
添加新的节点跟单链表有所不同
移除双链表中的节点
python实际运用
输出结果
(7)、使用队列实现双向列表
来源:https://www.jianshu.com/p/cbde180b9445


猜你喜欢
- 使用pyinstaller可以把.py文件打包为.exe可执行文件,命令为:pyinstaller hello.py打包后有两个文件夹,一个
- 今天发现一个很好用二维数组排序的php方法,usort,推荐给大家,以后二维数组里面,要按照一个字段的值排序用这个方法简单高效,例如下面的数
- 我就废话不多说了,大家还是直接看代码吧!import requestsimport jsonraw = {}headers中添加上conte
- matplotlib官网matplotlib库默认英文字体添加黑体(‘SimHei')为绘图字体代码:plt.rcParams[
- 在许多情况下,对外键使用更复杂的逻辑表达式是非常有用的。 此外,在某些情况下能够在索引视图创建约束也将非常实用。 我将举例说明,同时我希望针
- 昨天还和裕波沟通我没有准备ppt,想以另一种互动的方式来交流。后来想想,每个人都准备了,我不准备也不太好意思,呵呵。今天在webrebuil
- 背景2010年, OAuth 授权规范 1.0 (rfc 5849) 版本发布, 2年后, 更简单易用的 OAuth 2.0 规范发布(rf
- 本文实例为大家分享了vue更多筛选项小组件的实现方法,供大家参考,具体内容如下效果:就是一个简单的小效果,当有很多筛选条件时,默认只展示几项
- 事务控制的核心——Connection在开始之前,先让我们回忆一下数据库较原始的JDBC是怎么管理事务的: //仅
- props传值时子组件检测不到我们在Vue项目开发的过程中,经常会需要在父子组件传值,我们都知道,父子组件传值的时候是通过 props 来进
- 导语为什么有这么一个简单的游戏?这个游戏如此受欢迎?仅仅是因为它在游戏行业异常匮乏的年代出现,从而成为了一代人的记忆吗?恐怕并不是。玩过俄罗
- 我们利用linux系统中yum安装Apache+MySQL+PHP是非常的简单哦,只需要几步就可以完成,具体如下:一、脚本YUM源安装:1.
- 如何用SysOjects来获知数据库的信息?SysObjects中就保存了数据库中所有对象的信息,如:SELECT * FROM SysOb
- 有台服务器,访问量挺大,每天近250w动态pv,数据库查询平均每秒近600次 另一台服务器,跑的程序跟这台一样,不过只有每天约40w动态pv
- 本文章面向有一定基础的python学习者,使用Pygame包开发一款简单的游戏首先打开命令行,使用PyPI下载Pygame包(输入命令pip
- 一、picklepickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。&n
- 大家好,我是早起。最近在知乎上看到这样一个问题题主表示pandas用起来很乱,事实真的如此吗?本文就将先如何利用pandas来行数据转换/编
- 从PHP的5.4.0版本开始,PHP提供了一种全新的代码复用的概念,那就是Trait。Trait其字面意思是”特性”、”特点”,我们可以理解
- 看到一篇Implementing an Infinite Scroll with Vue.js , 觉得挺实用的就看了下, 顺便简单翻译了一
- 在不久前的一天,当我为了解决一个语法问题来翻阅VBscript文档时,偶然间发现在了下面的一句话: &nb