存储类别 | 顺序存储结构 | 单链表 |
存储分配方式 | 用一段连续的存储单元依次存储线性表的数据元素 | 采用链式存储结构,用一组任意的存储单元存放线性表的元素 |
时间性能 | 查找O(1)、插入和删除O(n) | 查找O(n)、插入和删除O(1) |
空间性能 | 需要预分配存储空间,大了浪费,小了上溢 | 不需要预先分配存储空间 |
总结:
1)当线性表需要频繁查找,较少插入和删除时,宜采用顺序存储结构。若需要频繁插入和删除,宜采用单链表。
2)当线性表的元素个数变化较大或不确定时,最好用单链表,这样不需要考虑存储空间大小问题。当事先知道线性表的大小长度,用顺序存储结构效率会高一些。
1.顺序存储
顺序表,使用数组实现,一组地址连续的存储单元,数组大小有两种方式指定,一是静态分配,二是动态扩展。
2.链式存储
链表的定义是递归的,它或者为空null,或指向另一个节点node的引用,这个节点含有下一个节点或者链表的引用。
与顺序存储相比,允许存储空间不连续,插入、删除元素不需要移动大量元素,只需要修改指针即可,但查找某个元素,只能从头遍历整个链表。
在Java中,使用嵌套类定义结点的抽象数据类型。
public class Node{
//链表节点的嵌套类
T item; //节点内容
Node next; //后继节点
}
2.1 单链表
单链表分为带头结点和不带头结点两种,不管有无头结点,头指针都指向链表的第一个节点(有头结点指向头结点)。
头结点:数值域可不设任何信息,头结点的指针域指向链表的第一个元素。
带头节点的好处:
(1)链表第一位置节点上的操作和其它位置上的操作一致;
(2)无论链表是否为空,头指针都指向头结点(非空),空表和非空表处理一样。
注:链表麻烦的地方是插入和删除时指针的修改,保证不断链,一般先断后链。