线性表是由n(n>=0)个相同的数据元素构成的有限序列
线性表分为
顺序表:在内存中用一块地址连续的空间依次存放线性表的元素 最常见的就是数组
顺序表的存、读数据不管在哪个位置,时间复杂度都是O(1),而在插入和删除元素的时候,时间复杂度都是O(n)
所以线性表比较适合元素个数稳定,高存取、低删减的应用
优点:
- 无需为表中的元素之间的逻辑关系增加额外的存储空间
- 可以快速的存取表中仍以位置的元素
缺点:
- 插入和删除操作需要移动大量的元素
- 当线性表长度变化较大的时候,难以确定存储空间的容量
- 容易造成存储空间的碎片
链表:散列存储
单链表:
在内存中的任何未被占用的随意单位中存放元素
存储自身Node + 后续节点的存储地址(指针) 组成
public class Node { /// <summary> /// 当前节点数据域 /// </summary> Object data; /// <summary> /// 指针域 /// </summary> Node next; }
第一个节点的存储位置叫做头指针
头结点:为了方便操作第一个元素,使其与其他元素的操作一致,一般无意义,但是可以用来存放链表的长度(非必要元素)
其中最后一个结点的后驱结点是null
双向链表:
由 前驱结点+Node+后驱结点 组成,其中最后一个结点的后区节点是null, 在C#中常见的双向链表数据结构是linkedlist
循环链表:
最后一个结点的后区节点不是null