1 线性表的基本定义
线性表:零个或者多个数据元素的有限序列。线性表中的元素在位置上是有序的,类似于储户去银行排队取钱,人们依次排着队,排在前面的先取,排在后面的则后取。这种位置上的有序性就是一种线性关系。由此可以看出:线性表的前后两个元素存在一一对应关系。
2 线性表的存储结构
顺序存储结构是指用一块连续的存储空间依次存储线性表中的数据元素,在顺序表中,逻辑上相邻的元素在物理上也是相邻的。
相比顺序表需要预先占用一块分配好的存储空间,链表就灵活一些。链表中逻辑上相邻的元素在物理上可以不相邻。
2.1 静态顺序表之数组
无法动态改变集合的大小
2.2 动态顺序表之ArrayList与List
ArrayList被称为动态数组,它的存储空间可以被动态的改变,同时还有添加、删除元素的功能。事实上,内存空间一旦分配时没有办法更改大小的。ArrayList其实使用“搬家”的方法来实现这个功能的。ArrayList需要扩容时,会在内存空间中开辟一块新区域,容量为原来的2倍,并把所有元素都复制到新内存空间中。
由于ArrayList实际存放的是object对象,在进行存取操作时需要进行大量的装箱和拆箱操作,降低程序性能。于是出现了泛型版本的List,它完美取代了ArrayList。
2.3 单链表ListDictionary
我们直到顺序表存在一个巨大的缺点:必须占用一整块事先分配好的存储空间,在插入和删除操作上需要移动大量元素(即操作不方便),于是不受固定存储空间限制并且可以进行比较快捷德插入和删除操作的链表横空出世。
单链表节点的定义:其中包括了一个数据域Item和一个指针域Next(指向后继节点的位置)。
public class Node<T>
{
// 数据域
public T Item { get; set; }
// 指针域
public Node<T> Next { get; set; }
public Node()
{
}
public Node(T item)
{
this.Item = item;
}
}
ListDictionary中的节点的数据域是一个键值对,而不是一个简单的value。
2.4 双向链表LinkedList
双链表中,每个节点都有两个指针,指向前驱和后继,这样方便地找到某个节点的前驱节点和后继节点。
2.5 循环链表
将单链表中终端节点的指针端由空指针改为指向头节点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表。
.5 循环链表
将单链表中终端节点的指针端由空指针改为指向头节点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表。