线性结构
目录
- 线性表
- 线性链表
- 循环链表
- 双向链表
线性表(linear list)
线性表:一个线性表是n个数据元素的有限序列
线性表的定义:
- 存在唯一一个被称为“第一个”的数据元素
- 存在唯一一个被称为“最后一个”的数据元素
- 除了第一个元素之外,每一个数据元素均只有一个前驱
- 除了最后一个元素之外,每一个数据元素均只有一个后继
一、单链表顺序存储结构(顺序表)
顺序表的基本概念
用一组地址连续的存储单元依次存储线性表的数据元素,在计算机中经常用数组来存储,但普通数组容量有限,所以可以采用动态数组来存储,动态数组先申请初始容量,当内容不断增加时,可以不断的扩大容量
优点改查元素容易,存储密度大
缺点增删元素时,需要移动大量元素
二、单链表链式存储结构(链表)
链表的基本概念
一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。
为了表示元素直接的逻辑关系,除了本身数据元素存储,还有节点存储来表示元素后继的信息
数据域存储数据元素
指针域存储后继节点的存储位置
- 结点:数据元素存储的地址
- 链表:n个结点由指针链接成链表
单链表:结点只有一个指针域,指针指向后继数据元素存储位置
循环链表:首尾指针相连的链表为循环链表
双向链表:一个元素有两个指针域,指针分别指向前驱和后继
头指针:是指向链表中第一个结点的指针
首元结点:第一个元素的存储的数据位置
头结点:在第一个元素之前设计的结点,其指针指向第一个元素的结点
头结点作用:是使所有链表(包括空表)的头指针非空,并使对单链表的插入、删除操作不需要区分是否为空表或是否在第一个位置进行,从而与其他位置的插入、删除操作一致。便于首元结点的处理
当头结点指向的指针域为空时,可得知为空表
结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上可以不相邻
这种存取元素的方法为顺序存取法
优点:添加和删除元素只需要修改指针指向即可,效率高
缺点:储存密度小,顺序存储法存储,存取效率不高
三、双向链表
双向链表的基本概念
即每个结点都有两个指针,指向各自的前驱和后继,相较于单向的表更便于遍历
//定义结点类
public class Link {
public int data; //数据域
public Link next; //后继
public Link previous;//前驱
public Link(int data){
this.data=data;
}
}
双向链表的插入和删除
只需要更新结点的前驱和后继即可
插入
link.previous=new