声明:本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正。
目录快捷跳转
- 线性表接口两个常用子类
- 什么时候选择ArrayList,什么时候选择LinkedList?
- 栈和队列的关系
- 栈
- 栈的实现根据使用的内部结构不同分为顺序栈和链式栈
线性表接口两个常用子类
ArrayList => 底层是基于动态数组的实现
LinkedList => 底层是基于双向链表的实现
- LinkedList是队列Queue的子类,还是双端队列Deque的子类;
- LinkedList有一个反向遍历的迭代器,从链表的尾部开始遍历;也有一个正向的迭代器,从链表的头部开始遍历。
- 使用List接口的方法都一样,都是List接口中定义好的方法;
什么时候选择ArrayList,什么时候选择LinkedList?
不同点 | ArrayList | LinkedList |
---|---|---|
存储空间上 | 物理上一定连续 | 逻辑上连续,但物理上不一定连续 |
随机访问 | 支持;O(1) | 不支持;O(N) |
头插 | 需要搬移元素,效率低O(N) | 只需修改引用的指向,时间复杂度为O(1) |
插入 | 空间不够时需要扩容 | 没有容量的概念 |
应用场景 | 元素高效存储+频繁访问 | 任意位置插入和删除(频繁) |
若ArrayList和LinkedList都默认调用add方法进行插入,这两个结构都在进行尾插;其实数组的尾插比链表还快elementData[size++] = val;
栈和队列的关系
栈和队列是操作受限的线性表,本质上栈和队列没什么不同,可以相互转换;
栈
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
- 入栈(push)
栈的插入操作叫做进栈/压栈/入栈;入数据在栈顶。 - 出栈(pop)
栈的删除操作叫做出栈;出数据在栈顶。 - 无论入栈还是出栈,都只能固定在栈顶进行。
- 查看栈顶元素peek():只取值,不删除。
栈的实现根据使用的内部结构不同分为顺序栈和链式栈
- 顺序栈:内部还是动态数组,规定只能从数组的末尾进行插入和删除;
插入 => 入栈
删除 => 出栈 - 链式栈:内部使用链表,默认规定在链表的尾部进行插入/删除;