链表定义与实例
[TOC]
链表 定义:
- 采用链表实现无序表
- 为了实现无序表数据结构, 可以采用链接表的方案。
- 虽然列表数据结构要求保持数据项的前后相对位置, 但这种前后位置的保持, 并不要求数据项依次存放在连续的存储空间
- 采用链表实现无序表
- 如下图, 数据项存放位置并没有规则, 但如果在数据项之间建立链接指向, 就可以保持其-前后相对位置第一个和最后一个数据项需要显式标记出来,一个是队首,一个是队尾,后面再无数据了。
链表实现:节点Node
- 链表实现的最基本元素是节点Node,每个节点至少要包含2个信息: 数据项本身,以及指向下一个节点的引用信息,注意next为None的意义是没有下一个节点了,这个很重要
1 | class Node: |
链表实现:无序表UnorderedList
- 所以无序表必须要有对第一个节点的引用信息,设立一个属性head,保存对第一个节点的引用空表的head为None
- 随着数据项的加入, 无序表的head始终,指向链条中的第一个节点,注意!无序表mylist对象本身并不包含数据项(数据项在节点中)其中包含的head只是对首个节点Node的引用,判断空表的isEmpty()很容易实现
- 接下来, 考虑如何实现向无序表中添加数据项, 实现add方法。
- 由于无序表并没有限定数据项之间的顺序
- 新数据项可以加入到原表的任何位置
- 按照实现的性能考虑, 应添加到最容易加入的位置上。
- 要访问到整条链上的所有数据项
- 都必须从表头head开始沿着next链接逐个向后查找
- 所以添加新数据项最快捷的位置是表头,整个链表的首位置。
1 | class UnorderedList: |
有序表OrderedList
有序表是一种数据项依照其某可比性质(如整数大小、 字母表先后) 来决定在列表中的位置,越“小”的数据项越靠近列表的头, 越靠“前”
在实现有序表的时候, 需要记住的是, 数据项的相对位置, 取决于它们之间的“大小”比较由于Python的扩展性,下面对数据项的讨论并不仅适用于整数,可适用于所有定义了
__gt__
方法(即’>’操作符)的数据类型对于isEmpty/size/remove这些方法,与 节 点 的 次 序 无 关 , 所 以 其 实 现 跟
UnorderedList 是一样的。
1 | class OrderedList: |