基础数据结构(3) - 无序列表和有序列表

385 阅读6分钟

无序列表

列表是元素的集合,其中每一个元素都有相对于其他元素的位置,这种列表被称为无序列表。我们可以认为列表有第一个元素、第二个元素、第三个元素,等等;也可以称第一个元素为列表的起点,最后一个元素为列表的终点。

无序列表的抽象数据类型

List() 创建一个空列表。它不需要参数,且会返回一个空列表。

add(item) 假设元素 item 之前不在列表中,并向其中添加 item。它接受一个元素作为参数,无返回值。

remove(item) 假设元素 item 已经在列表中,并从其中移除 item。它接受一个元素作为参数,并且修改列表。

search(item) 在列表中搜索元素 item。它接受一个元素作为参数,并且返回布尔值。

isEmpty() 检查列表是否为空。它不需要参数,并且返回布尔值。

length() 返回列表中元素的个数。它不需要参数,并且返回一个整数。

append(item) 假设元素 item 之前不在列表中,并在列表的最后位置添加 item。它接受一个元素作为参数,无返回值。

index(item) 假设元素 item 已经在列表中,并返回该元素在列表中的位置。它接受一个元素作为参数,并且返回该元素的下标。

insert(pos, item) 假设元素 item 之前不在列表中,同时假设 pos 是合理的值,并在位置 pos 处添加元素 item。它接受两个参数,无返回值。

pop() 假设列表不为空,并移除列表中的最后一个元素。它不需要参数,且会返回一个元素。

pop(pos) 假设在指定位置 pos 存在元素,并移除该位置上的元素。它接受位置参数,且会返回一个元素。

实现无序列表:链表

为了实现无序列表,我们需要构建链表无序列表需要维持元素之间的相对位置,但是不需要在连续的内存空间中维护这些位置信息。

以下图中的元素集合为例,这些元素看上去是随机的,但是如果我们通过为每一份元素维护一份信息(下一个元素的位置),那么这些元素的相对位置就能通过指向下一个元素的链接来表示。

image.png image.png

需要注意的是,必须要指明列表中第一个元素的位置,因为我们知道第一个元素的位置以后,就可以通过第一个元素的链接信息访问第二个元素,以此类推访问后面的元素。指向链表第一个元素的引用被称为。最后一个元素需要知道自己没有下一个元素。

Node类

节点是构建链表的基本数据结构,每一个对象节点对象都必须持有至少两份信息。首先,节点必须包含列表元素,我们称之为数据变量。其次,节点必须保存指向下一节点的引用。

用Python实现Node类

在构建节点时,需要为其提供初始值,执行下面的赋值语句会生成一个包含数据值93的节点对象。

image.png

class Node:
    def _init_(self, initData):
        self.data = initData
        self.next = None // None是Python的特殊引用值,指向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()
93

UnorderedList类

无序列表(unordered list) 是基于节点集合来构建的,每一个节点都通过显式的引用指向下一个节点,所以UnorderedList类必须包含指向第一个节点的引用

UnorderedList类的构造方法
class UnorderedList:
    def _init_(self):
        self.head = None

>>> myList = UnorderedList()

赋值语句myList = UnorderedList()将创建如下图所示的链表:

image.png 那么图3-18中的元素应该如下图所示的链表来展示:

image.png

有序列表

有序列表中,元素的相对位置取决于它们的基本特征。它们通常以升序或者降序排列。

有序列表的抽象数据类型

OrderedList() 创建一个空有序列表。它不需要参数,且会返回一个空列表。

add(item) 假设item 之前不在列表中,并向其中添加 item,同时保持整个列表的顺序。它接受一个元素作为参数,无返回值。

remove(item) 假设 item 已经在列表中,并从其中移除 item。它接受一个元素作为参数,并且修改列表。

search(item) 在列表中搜索 item。它接受一个元素作为参数,并且返回布尔值。

isEmpty() 检查列表是否为空。它不需要参数,并且返回布尔值。

length() 返回列表中元素的个数。它不需要参数,并且返回一个整数。

index(item) 假设 item 已经在列表中,并返回该元素在列表中的位置。它接受一个元素作为参数,并且返回该元素的下标。

pop() 假设列表不为空,并移除列表中的最后一个元素。它不需要参数,且会返回一个元素。

pop(pos) 假设在指定位置 pos 存在元素,并移除该位置上的元素。它接受位置参数,且会返回一个元素。

实现有序列表

整数有序列表17,26,31,54,77,93,可以如下图所示的链式结构来表示

image.png

OrderedList类的构造方法

OrderedList类和UnorderedList类的构造方法相同,都是head指向None,代表这是一个空列表。

class OrderedList:
    def _init_(self):
        self.head = None

基础数据结构章节 - 小结

  1. 线性数据结构以有序的方式来维护数据。
  2. 是简单的数据结构,其排序原则是LIFO,即后进先出。
  3. 的基本操作有push、pop和isEmpty。
  4. 队列是简单的数据结构,其排序原则的FIFO,即先进先出。
  5. 队列的基本操作有enqueue、dequeue和isEmpty。
  6. 表达式有三种写法:前序、中序和后序。
  7. 在计算和转换表达式的算法中十分有用。
  8. 具有反转特性。
  9. 队列有助于构建时序模拟。
  10. 双端队列是栈和队列的结合。
  11. 双端队列的基本操作有addFront、addRear、removeFront、removeRear和isEmpty。
  12. 列表是元素的集合,其中每一个元素都有一个相对于其他元素的位置。
  13. 链表保证逻辑顺序,对实际的存储顺序没有要求。
  14. 修改链表头部是一种特殊情况。