Python中常用的数据结构—链表

常用的数据结构有数组、链表(一对一)、栈和队列、哈希表、树(一对多)、图(多对多)等结构。
在本目录下我们将讲解,通过python语言实现常用的数据结构。

2.链表

2.1链表的结构
链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
(1)单向链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一节点的指针next。
表示方式如下:

#定义单链表节点
class Node:def __init__(self, data):self.data = dataself.next = None

(2)双向链表不仅能找到下一个节点,还可回溯到前置节点。其每一个节点包括data变量,next和prev指针。
表示方式如下:

#定义双向链表节点
class Node:def __init__(self, data):self.data = dataself.next = Noneself.prev = None

2.2链表的基本操作
(1)查找操作
在查找元素时,链表不像数组那样可以通过下标快速进行定位,只能从头结点开始向后一个一个节点主义查找。步骤:首先定位到头结点,然后根据头结点的next指针,定位到下一个节点,就这样不断通过next指针顺序定位,直到定位到要查找的元素。
关键点:链表中的数据只能按顺序进行访问,最坏的时间复杂度是O(n)。
(2)更新(修改)节点
如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据(data)替换成新数据(data)即可。
(3)插入节点

  • 尾部插入
    尾部插入,是最简单的情况,把最后一个节点的next指针指向新插入的节点即可。
  • 头部插入
    第一步,把新节点的next的指针指向原先的头结点。
    第二步,把新节点变为链表的头结点。
  • 中间插入
    第一步,新节点的next指针指向插入位置的节点。
    第二步,插入位置前置节点的next指针,指向新节点。
    (4)删除元素
  • 尾部删除
    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即可。
  • 头部删除
    头部删除,也很简单,把链表的头结点设为原先头结点的next指针所指向的节点即可。
  • 中间删除
    中间删除,同样很简单,只需把删除节点的前置节点的next指针,指向要删除的节点的下一个节点即可。
    注意:许多高级语言,如java、python,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。
    关键点:如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作。时间复杂度都是O(1)。
    下面程序是实现,链表的查找、插入、删除操作。为了尾部插入的方便,代码中额外增加了指向链表尾节点的指针last。
class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.size = 0 #节点的个数self.head = None #初始化节点的头指针self.last = None #初始化节点的尾指针#查找第几个节点,index表示第几个节点,不是索引号def get(self,index):if index < 0 or index >= self.size:raise Exception("超出链表节点范围!")p = self.headfor i in range(index):p = p.nextreturn pdef insert(self, data, index):if index < 0 or index > self.size:raise Exception("超出链表节点范围!")node = Node(data)#空链表if self.size == 0:self.head = nodeself.last = node#插入头部elif index == 0:node.next = self.headself.head = node#插入尾部elif index == self.size:self.last.next = nodeself.last = node#此处不需要让node.next指向None,默认指向None了#插入中间else:pre_node = self.get(index-1)#查找到插入节点的前置节点node.next = pre_node.nextpre_node.next = nodeself.size += 1 #不要忘记插入节点后,链表的节点数要加1def remova(self, index):if index < 0 or index >= self.size:raise Exception("超出链表节点范围!")#暂存被删除的节点,用于返回#删除头结点if index == 0:remove_node = self.headself.head = self.head.next#删除尾节点elif index == self.size:pre_node = self.get(index-1)remove_node = pre_node.nextpre_node.next = Noneself.last = pre_node#删除中间节点else:pre_node = self.get(index-1)next_node = pre_node.next.nextremove_node = pre_node.nextpre_node.next = next_nodeself.size -= 1 #不要忘记删除节点后,链表的节点数要减1return remove_nodedef output(self):p = self.head# while p :while p is not None:print(p.data,end="\t")p = p.nextlinklist = LinkedList()
linklist.insert(30, 0)
linklist.insert(60, 0)
linklist.insert(20, 1)
linklist.insert(90, 0)
linklist.output()
#结果为:90  60  20  30
print() #换行符
linklist.remova(0)
linklist.output()
#结果为:60  20  30

Python中常用的数据结构---链表相关推荐

  1. Python中常用的数据结构---哈希表(字典)

    Python中常用的数据结构-哈希表(字典) 常用的数据结构有数组.链表(一对一).栈和队列.哈希表.树(一对多).图(多对多)等结构. 在本目录下我们将讲解,通过python语言实现常用的数据结构. ...

  2. python常用单词读法-Python中常用英文单词大全

    原标题:Python中常用英文单词大全 application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架 ...

  3. Python中常用的数据分析工具(模块)有哪些?

    本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...

  4. Python中常用的一些操作总结(未完待续)update @ 2017-5-18

    写在前面的话 其实也没有什么可以写的,或者说完全没有价值.因为你只要动一动手指就可以在Google上找到我要写的这些东西.只是我还不习惯好久没有碰我的blog,但是我又不想写没有价值的东西.或许有价值 ...

  5. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  6. python中常用的工具包

    一.Python中常用的科学计算工具包: 我们最了解的科学计算工具可能是Matlab,它能进行集数值计算,可视化工具及交互于一身,可惜的是它是一个商业产品.开源方面除了GNU Octave在尝试做一个 ...

  7. Python中常用的配置文件

    Python中常用的配置文件 常见的配置文件 py文件 变量方式 类方式 yaml文件 yaml文件基础知识 yaml作为配置文件 python读取yaml文件 python写入yaml文件 yaml ...

  8. Python中常用的高阶函数

    Python 中常用的高阶函数 ① filter(function,iterable)filter(function, iterable)filter(function,iterable)   过滤器 ...

  9. python中常用的模块二

    一.序列化 指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化, 不同的序列化结果不同,但目的是一样的,都是为了存储和传输. 一,pickle.可 ...

最新文章

  1. android默认exported_android:exported 属性详解
  2. python进行数据分析 kindle_利用Python进行数据分析
  3. TypeScript 枚举指南
  4. 2015蓝桥杯省赛---java---C---9(打印大X)
  5. 字符串驻留机制截图?#注意回顾字符串的深浅拷贝小数据池那节
  6. 华三交换机如何进入配置_学校机房项目交换机的如何配置,理解这篇,交换机配置不再难...
  7. Django之序列化
  8. python读取txt、csv以及xml文件
  9. python列表推导式生成随机数_Python:列表推导式/生成器推导式
  10. 奇怪的等待事件“enq: ss - contention”
  11. java.util.Scanner的日常用法
  12. Atitit.计算机图形图像图片处理原理与概论attilax总结
  13. 在.net中序列化读写xml方法的总结
  14. MYSQL SHOW VARIABLES简介
  15. 2.16 自定义快速访问工具栏以提升工作效率 [原创Excel教程]
  16. 华为s2600t java_华为S2600T------v1版本
  17. PDF怎么转换成JPG图片?教你如何快速转换
  18. xboxone硬盘坏的表现_详解硬盘常见的故障及解决方法
  19. 《CryENGINE+Game+Programming+with+C++,+C#,+and+Lua》第七章
  20. 在Window10子系统Ubantu创建conda环境

热门文章

  1. constant用法
  2. iPhone X适配
  3. Linux电子书项目之freetype实现矢量字体的显示(2)
  4. vue父子组件传值的一些坑(深浅拷贝)
  5. 服务器几种系统,服务器有几种操作系统
  6. 僵尸索引 Dangling indices
  7. CIFAR10数据集训练及测试
  8. 详解EM算法与混合高斯模型(Gaussian mixture model, GMM)
  9. 开源 基于Android的SIP电话-----Speex 回音消除 在android 平台
  10. 会计初级可以自己报名吗_初级会计考试可以使用手机报名吗?