无序列表下面的内容怎么取消缩进_Python数据结构与算法18:基本结构:无序表

:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性。

本文阅读时间约为5分钟

这一节要讲的是无序表(unordered list)。

列表这种抽象数据类型

前面学过的栈、队列和双端队列等线性数据结构,全部都是用Python的列表(list)来实现的。列表本身就是一种简单强大的数据集结构,提供了丰富的操作接口。

但是,并非所有编编程语言都能提供类似Python列表这种数据类型;其它语言来实现走列表数据类型这条路,可能需要另想办法。

本节内容就是看看列表本身这种抽象数据类型需要具备哪些特性,以及如何用另外的方式实现列表。

无序表unordered list

无序表是一种数据项按照相对位置存放的数据集。特别地,被称为“无序表unordered list”,其中数据项只按照存放位置来索引,如第1个、第2个……、最后一个等。

下面是几个例子(为了简单明晰地表示,假设表中不存在重复的元素): 一个考试分数的集合"54, 26, 93, 17, 77, 31",如果用无序表来表示,就是[54, 26, 93, 17, 77, 31]

无序表List的操作如下:

  • 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()——从无序表末尾移除数据项,假设原无序表至少有1个数据项。
  • .pop(pos)——移除位置为pos的数据项,假设原无序表存在位置pos。

以上无序表List跟Python中的基本数据类型列表list几乎是一致的。 下面用另外一种方式来实现无序表List,那就是链接表(也叫链表)。

采用链表实现无序表

虽然无序表的数据结构要求保持数据项的前后相对位置,但这种前后位置的保持,并不要求数据项依次存放在连续的存储空间。

数据项存放位置并无规则,但如果在数据项之间建立链接指向,就可以保持其前后相对位置。要注意的是,第一个和最后一个数据项需要特别标记出来,一个是队首,一个是队尾。

所以单链表只能根据顺序存取数据。如下图 Pic-313-1 链表的示意图 所示:

3a0b0d5fbc148348bd4778dc5ff433e6.png

Pic-313-1 链表的示意图

链表实现:节点Node

链表实现的最基本元素是节点(Node)。

每个节点至少包含2个信息:数据线本身以及指向下一个节点的引用信息。如果next为None,就表示没有下一个节点了。

36a7192568827902f2e03711cb1c9da7.png

Pic-313-2 节点Node示意图

可以采用链接节点的方式构建数据集,来实现无序表unordered list。

class Node:    def __init__(self, initdata):          self.data = initdata  # 设置初始化的节点数据。        self.next = None  # 初始化对象的下一个节点设置为None。        def getData(self):  # 返回数据项。        return self.data          def getNext(self):  # 返回下一个节点。        return self.next          def setData(self, newdata):  # 修改数据项。        self.data = newdata        def setNext(self, newnext):  # 修改下一个节点的指向引用。        self.next = newnext        temp = Node(93)temp.getData()Out[33]: 93

链表的第一个和最后一个节点最重要,所以无序表必须要有对第一个节点的引用信息。

链表的访问机制是,必须从第一个节点开始,沿着链接一个一个地遍历下去,直到访问最后一个节点,即该节点的指向引用next为None空值的节点为止。

所以,如果要实现无序表,必须要有对第一个节点的引用信息。具体做法是,设立一个属性head,保存对第一个节点的引用信息。

空无序表的head为None。

随着数据项的加入,无序表的head始终指向链条中的第一个节点。

class UnorderedList:    def __init__(self):        # 设立一个属性head,用来保存对第一个节点的引用信息。        self.head = None  # None表示这个head(表头)是空的。mylist = UnorderedList()  # UnorderedList这个类的实例化。print(mylist.head)None  # 打印出来时一个空表头(head)。

随着数据项的加入,无序表的head始终指向链条中的第一个节点。

注意,如 Pic-313-3 无序表、数据项的关系 所示,无序表mylist对象本身并不包含数据项(因为数据项被包含在节点内部)。无序表mylist包含的head只是对第一个节点Node的引用。

d274fef95d2f396afa876a7e8dcdd0af.png

Pic-313-3 无序表、数据项的关系

判断一个无序表是否空表,可以用isEmpty()实现。

return self.head == None  # 返回True表示是空表,否则是非空表。

To be continued.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值