使用python实现链表操作


Posted in Python onJanuary 26, 2018

一、概念梳理

链表是计算机科学里面应用应用最广泛的数据结构之一。它是最简单的数据结构之一,同时也是比较高阶的数据结构(例如?!⒒沸位撼搴投恿校?/p>

简单的说,一个列表就是单数据通过索引集合在一起。在C里面这叫做指针。比方说,一个数据元素可以由地址元素,地理元素、路由信息活着交易细节等等组成。但是链表里面的元素类型都是一样的,是一种特殊的列表。

一个单独的列表元素叫做一个节点。这些节点不像数组一样都按顺序存储在内存当中,相反,你可以通过一个节点指向另外一个节点的指针在内存不同的地方找到这些元素。列表最后一项习惯用NIL表示,相当于python里面的None

这里介绍两种不同的列表——单链表和双链表。双链表中的某个节点只会指向列表中的下一个元素,但是在双链表里面,当前节点同时也会指向前一个节点。所以双链表会占用更多的内存,因为它需要额外的变量去存储索引

使用python实现链表操作

图一、单链表

使用python实现链表操作

图2:双链表

单链表可以从头到尾顺序查询,但是反过来就不是那么容易了。然而,双链表不管你是从哪个节点开始,从任意方向查询都是一样的。在单链表中增加和删除节点只需要两步,但是在双链表里就需要四步了。

但是在python里面没有提供像双链表一样的数据结构,所以我们可以自己创建一个这样的数据结构

二、如果使用python创建链表

(1).将节点定义成一个数据结构

首先我们将节点类定义成ListNode,该类在初始化实例对象时,定义了两个实例变量,其中data用来存储节点的值,next用来存储下一个节点的索引,下面详细介绍一下一个节点要定义的方法和属性

__init__():初始化节点
self.data:存储节点的值
self.next:存储指向下一个节点的索引
has_value():将当前节点值和其他的值比较

上面的方法和属性涵盖了一个节点应有的基本属性和行为

Listing1:The ListNode class

使用python实现链表操作

上面创建了最简单的节点类,下面初始化ListNode的对象

Listing2:初始化节点

使用python实现链表操作

上面创建了三个独立的节点

(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)

使用python实现链表操作 

(3)、添加节点

通过add_list_item()添加列表元素。先检测是不是ListNode的实例,如果不是,就新建一个节点。如果列表还是空的话,就把该节点当作头节点,如果不是空,就将当前节点指向下一个元素(也就是刚新添加的节点)。把新节点添加到列表当中

Listing4:The SinglelinkedList class(part two)

使用python实现链表操作

list_length()方法计算节点数量,返回列表的长度。在一个循环当中循环列表,self.next依次指向下一个节点

Listing5:The SingleLinkedList class(part three)

使用python实现链表操作

output_list()用来输出新的节点值

Listing6:The SingleLinkedList class(part four)

使用python实现链表操作

下面我们初始化SingleLinkedList的实例track,然后创建4个节点。

使用python实现链表操作 (4)查询列表

查询整个列表使用unordered_search()。它需要使用一个额外的参数帮助查询。列表的头是切入点。

使用python实现链表操作 (5)、从列表中移除一个元素

从列表中移除一个节点 时,指向该节点索引需要被移动到,被移除节点的下一个节点。被移除的节点会由python的垃圾回收机制清除

Listing10:Removing a node by node number

使用python实现链表操作 

(6)、创建一个双链表

创建双链表其实就是在ListNode的基础上,在创建一个previous的属性

Listing11:Extended list node class

使用python实现链表操作

然后我们就可以依据上面的定义新建一个双链表类

使用python实现链表操作

添加新的节点跟单链表有所不同

使用python实现链表操作

移除双链表中的节点

使用python实现链表操作

python实际运用

使用python实现链表操作

输出结果

使用python实现链表操作 

(7)、使用队列实现双向列表

使用python实现链表操作

Python 相关文章推荐
python 多进程通信模块的简单实现
Feb 20 Python
Python 的 with 语句详解
Jun 13 Python
视觉直观感受若干常用排序算法
Apr 13 Python
浅析python递归函数和河内塔问题
Apr 18 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
Python正则表达式和元字符详解
Nov 29 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
pycharm中显示CSS提示的知识点总结
Jul 29 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 Python
Python中optparser库用法实例详解
Jan 26 #Python
python利用socketserver实现并发套接字功能
Jan 26 #Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 #Python
Python编程实现的简单神经网络算法示例
Jan 26 #Python
Django使用httpresponse返回用户头像实例代码
Jan 26 #Python
Django rest framework基本介绍与代码示例
Jan 26 #Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 #Python
You might like
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
js实现div色块碰撞
2020/01/16 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
Python3实现从指定路径查找文件的方法
2015/05/22 Python
21行Python代码实现拼写检查器
2016/01/25 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python获取时间戳代码实例
2019/09/24 Python
Python 求数组局部最大值的实例
2019/11/26 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
python爬虫 requests-html的使用
2020/11/30 Python
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
高中军训感想300字
2014/03/04 职场文书
演讲主持词
2014/03/18 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
nginx中proxy_pass各种用法详解
2021/11/07 Servers
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android