使用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 中__name__ = '__main__' 的作用
Jul 05 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
python实现屏保计时器的示例代码
Aug 08 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
Oct 17 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
Django基础知识 web框架的本质详解
Jul 18 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
python修改微信和支付宝步数的示例代码
Oct 12 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 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
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
php检查页面是否被百度收录
2015/10/28 PHP
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
is_file和file_exists效率比较
2021/03/14 PHP
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
业务员岗位职责范本
2013/12/15 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
优秀团支部申报材料
2014/12/26 职场文书
通知的格式范文
2015/04/27 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle