文章目录
线性表概述
- 最常用和最简单的数据结构
- 类似排队的组织方式
- 线性表,顾名思义,具有像线一样性质的表
- 强调元素间的有序性(只有一个前驱和只有一个后继)和有限序列
实例
线性表的抽象数据类型
线性表的顺序存储结构
- 两种物理结构其一:顺序存储
- 分清:线性表容量与线性表当前长度
- 描述顺序存储结构的三个属性
- 存储空间起始位置
- 线性表的最大存储容量
- 当前长度
地址计算方法
数组插入和删除
时间复杂度
顺序存储结构总结
链式存储结构
头结点与头指针
- 头结点:单链表的第一个节点前的节点,数据域不存储任何信息,指针域存储指向第一个节点的指针
- 无论链表是否为空,头指针均不为空
单链表的读取
插入
- p和p.next间插入节点s
删除
单链表的整表创建
- 顺序存储结构的创建:初始化数组
- 链式存储结构:动态生成链表的过程
头插法和尾插法
public class InitializeLinkedList {
void createList_headInsert(int num){
ListNode pHead = new ListNode(-1);
pHead.next = null;
for(int i=0;i<num;i++){
ListNode node = new ListNode(i);
node.next= pHead.next;
pHead.next = node;
}
print(pHead.next);
}
void createList_tailInsert(int num){
ListNode pHead = new ListNode(-1);
ListNode head = pHead;
pHead.next = null;
for(int i=0;i<num;i++){
ListNode node = new ListNode(i);
head.next = node;
head = node;
}
print(pHead.next);
}
//just for test
@Test
public void test(){
createList_headInsert(5);
System.out.println();
createList_tailInsert(5);
}
void print(ListNode head){
while(head!=null){
System.out.println(head.val);
head = head.next;
}
}
}
单链表的整表删除
- 释放链表占据的空间
两种存储结构对比
静态链表
概述
定义
- 用数组描述的链表
- 未被使用的数组元素称为备用链表
实例
插入操作
- 代码略
静态链表的删除
优缺点
- 理解思想,改变下标而不用移动元素
循环链表
定义
循环判断条件
O(1)时间访问头尾结点(使用尾指针)
尾指针实例
- 合并循环链表
双向链表
概述
双向循环链表
双向的代价
- 遍历,求长度,获得位置仍然只涉及一个方向的指针
- 增删时要更改两个指针变量
插入操作