orm 通过外链表查找数据_码哥聊Python数据结构--链表

7870625c9e65d50225001f8f199b44f0.png

前几天我们开了个数据结构的坑,说了,留言里有同学提到链表,那今天码哥就来讲讲链表。

链表是什么

链表、列表,说起来有点相似,作用也有点类似,但可别傻傻分不清楚。我们一般说的列表,是一个连续的序列,用来存储一组数据。而链表,虽然也是有序的存储结构,但它不限定要“连续”的。

打个比方:列表就好像火车,每一节车厢连在一起,如果你知道车头在哪里,大致就也能知道第8节车厢在哪。

链表,就像是去往同个目的地的车队,有很多辆车,大家排着队行驶。虽是一个整体,但队伍的顺序是可以很容易调整的。

c9920f850f91093cd7ed0b994cf296da.png

从概念定义上来说,链表是一种以线性顺序存储的数据结构,但并不要求按顺序存储。它由节点组成,每个节点除了储存自身数据外,还包含一个指向下一个节点的引用(或指针)。

这就是一个包含5个节点的链表示意图:

93e551a2373cf85aef2a4cd652a9deda.png

通常,我们会有一个 head 引用指向链表的开头,而链表的结尾,下一个节点则指向空值 None。

除了上图演示的单向链表外,还存在双向链表(每个节点还增加一个指向前一个节点的引用)和循环链表(最后一个节点的下一个节点会指向第一个节点)。

链表有什么用

老问题又来了:为什么要有链表?

链表相较顺序存储列表,最大的好处就是很容易往序列中添加和删除元素,单看插入和删除操作,最优可达到O(1)的复杂度。这个从上面举的火车和车队的例子就可以想象出来。另外,链表的好处还有不需要连续的存储空间,且不需要预先知道数据集的大小

但链表也有它的不足,就是如果你要查找某个节点,或访问指定序号的节点,效率则比较低。

所以,链表更适合需要频繁增删元素但很少查找元素,或者无法预知数据规模的场景

举一个例子:玩过格斗游戏的人,都知道有个“搓招”的设定,就是你按下一定顺序的按键(如 →↓↘→AB),就会触发角色的特殊招式。当玩家操作角色时,会不停按下各个按键,这时如果你想判断最近的按键组合是否符合某一固定招式,就可以用链表来记录最近的按键历史,并且在过程中不断更新。

69c1de78387d5a4f785d563cd2c04ca3.gif

那么,为何我们标题说链表是数据结构的重要根基呢?因为从上面的描述我们可以看出,链表的节点是非常灵活的,可以组织成不同的结构。例如我们上次提到的栈,就完全可以改为用链表实现。其他的一些数据结构,如队列、树、图,一些算法,如 LRU(最近最少使用算法),文件系统等,均会用到链表这种数据结构。

最近又火起来的概念:区块链,它也是某种意义上的链表。

链表的实现

我们用 Python 语言来自己实现一个单向链表结构,以加深理解。

功能需求:

创建一个 SingleLinkedList 类,具备以下功能:

  1. SingleLinkedList() - 创建新的单链表,不需要参数,返回空链表。
  2. addFirst(item) - 将元素添加到链表头,需要参数,无返回值。
  3. remove(item) - 删除链表内元素,需要参数,并修改单链表的内容。
  4. isEmpty() - 检查单链表是否为空,不需要参数,返回布尔值。
  5. length() - 返回单链表中元素个数,不需要参数,返回整数。

开发思路:

照例先来几张示意图,理一下上述几个功能:

1. 创建节点、单链表并 addFirst(item)

ee99b900fb7e81105f27c7b38313ffd9.png

2. 继续 addFirst(item) 添加节点。

c3729d568b2920aa5b1a9277d3310998.png

3. 多次添加节点后就会出现我们开头的单链表。

f51f0ca16c4393b5953574c44603e71b.png

93e551a2373cf85aef2a4cd652a9deda.png

4. 删除储存数据为4的头部节点

3631293f041e1d4d29f83cce6f228707.png

5. 删除链表中间储存元素为2的中间节点

07a6f57a441d0140f15f21d50594c026.png

在删除链表元素的过程包含两个步骤:

1. 遍历链表,找到删除的元素。我们从 head 节点找起,直到 next 节点为 None 的尾部节点

2. 当找到元素后,将其前一个节点的 next 节点指向它原本的 next 节点,也就实现了从列表中删除元素

代码实现:

class 

以上便是一个单链表的 Python 实现。

觉得码哥说得还行,还望动动手指点个“赞同”支持一下。也欢迎大家来关注我的“编程学习者社区”,我们一起学编程!

作者:码不理
来源:编程学习者社区
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于echarts和Python的动态实时大屏范例中,使用database作为数据源是一个常见的应用场景。 首先,我们可以通过Python编程语言连接到数据库,并实时获取数据。例如,我们可以使用相关的Python库(如pymysql、psycopg2等)来连接MySQL、PostgreSQL等数据库。 然后,我们可以通过定时任务或者事件监听等方式,定期或实时地从数据库中获取最新的数据。在获取数据的过程中,我们可以使用SQL查询语言或者ORM框架来过滤、聚合或处理数据,以满足实时大屏展示的需求。例如,我们可以使用SQL语句查询数据库中的表格数据,或者使用ORM框架从数据库中获取对应的对象。 接下来,我们可以将获取到的数据使用echarts库进行可视化展示。echarts是一种基于JavaScript的可视化库,提供了丰富的图表类型和配置选项,能够实现动态、交互式的数据可视化。通过将数据传输到前端,我们可以使用echarts库创建对应的图表,并将数据实时展示在大屏中。 在动态实时大屏范例中,我们可以根据数据库中的数据实时更新echarts图表的数据,从而实现动态变化和实时更新。例如,我们可以使用定时任务或事件触发器来定期或实时地获取最新的数据,然后通过JavaScript将数据传递到echarts中。 总结而言,基于echarts和Python的动态实时大屏范例中,使用database作为数据源是通过Python连接数据库、获取最新数据,并使用echarts进行可视化展示的流程。这样可以实现动态实时的大屏展示效果,满足数据可视化和实时监测的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值