python链表添加多个值_Python数据结构与算法分析 day8

a3cabcd78068c2a2e62e67271dc71991.png 2b98b4301811093d8e84e1e696d87304.png

一、双端队列

2b98b4301811093d8e84e1e696d87304.png

双端队列跟队列相似是一种有次序的数据集,跟队列相似,两端成为首尾端,但双端队列中的数据项既可以从两端加入,也可以从两端移除。某种意义来说,双端队列集成了栈和队列的能力。

双端队列不具备先进先出或后进先出的特性,如果用双端队列来模拟栈或队列需要由使用者自行维护操作的一致性。

cfd71d9a3b4ad5b8cae202851173a2c6.png

2b98b4301811093d8e84e1e696d87304.png

二、双端队列抽象数据类型

2b98b4301811093d8e84e1e696d87304.png

Deque():创建一个空双端队列

addFront(item):将item加入队首

addRear(item):将item加入队尾

removeFront():从队首移除数据,返回值为移除的数据项

removeRear():从队尾移除数据,返回值为移除的数据项

isEmpty():返回双端队列是否为空

size():返回双端队列中包含数据项的个数

1ba0d7284f64f4b728bb9911e4d4f4e3.png 2b98b4301811093d8e84e1e696d87304.png 2b98b4301811093d8e84e1e696d87304.png

三、用Python实现双端队列

2b98b4301811093d8e84e1e696d87304.png

采用List实现:List下标为0作为deque的尾端;List下标为-1作为deque的首端。在前端进行添加和移除操作的时间复杂度为O(1);后端则是O(n)。

3b5922d7802695073d8212f493ce8f5e.png

2b98b4301811093d8e84e1e696d87304.png

四、双端队列的应用---回文词判定

2b98b4301811093d8e84e1e696d87304.png

回文词是指正读和反读都一样的词,如radar、madam、toot。

用双端队列很容易解决回文词的问题,先将需要判定的词从队尾加入deque,再从两端同时移除字符判定是否相同,直到deque中剩下0个或1个字符。

1f5146e9bc85d0be0946ef7b9bc666f0.png Python的实现: 68f71cbad27c67adb07042bdca193f6f.png 2b98b4301811093d8e84e1e696d87304.png

五、列表

2b98b4301811093d8e84e1e696d87304.png

在前边学习的基本数据结构中,我们采用Python List实现了多种线性数据结构。列表是一种简单强大的数据集结构,提供了丰厚的操作接口,但并不是所有的编程语言都提供了List数据类型,有时需要程序员自己实现。

一种数据项按照相对位置存放的数据集被称为无序列表,数据项只按照存放位置来索引,如第一个、第二个……、最后一个等。为简单起见,假设列表不存在重复数据项。如一个考试分数的集合“54,26,93,17,77,31”,用无序表表示为[54 26 93 17 77 31]

2b98b4301811093d8e84e1e696d87304.png

六、无序表的抽象数据类型

2b98b4301811093d8e84e1e696d87304.png

List():创建一个空列表

add(item):添加一个数据项到列表中,假设item原先不在列表中

remove(item):从列表中移除item,列表被修改,item原先在表中

search(item):在列表中查找item,返回布尔类型值

isEmpty():返回列表是否为空

size():返回列表中包含数据项的个数

append(item):添加一个数据项到表末尾,假设item原先不存在列表中

index(item):返回数据项在表中的位置

insert(pos,item):将数据项插入到位置pos,假设item原先不存在列表中,原列表具有足够多个数据项,能让item占据位置pos

pop():从列表末尾移除数据,假设原列表至少有一个数据项

pop(pos):移除位置为pos的数据项,假设原列表存在位置pos

2b98b4301811093d8e84e1e696d87304.png

七、采用链表实现无序表

2b98b4301811093d8e84e1e696d87304.png 为了实现无序列表,我们要构建链表。虽然列表数据结构要求保持数据项的前后相对位置,并没有要求数据项依次存放在连续的存储空间。 00c45ec4268ae0c435f14ff014f6529f.png

如下图,数据项存在位置并没有规则,但如果在数据项之间建立链接指向,就可以保持前后相对位置了。第一个和最后一个数据需要显式标记出来,一个是队首,一个是队尾,后边再无数据了。

2131608cf2fb3686046e61e0be0ec6cb.png

节点Node

链表实现的最基本元素是节点Node,每个节点至少要包含两个信息:数据项本身、指向下一节点的引用信息。(当next=None时,就没有下一个节点了)

0d777fd38a3a26f992ed0639099b403d.png

链表实现节点Node

4aa456f7832ea9f44284980a65236065.png—END—
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值