数组与字符串*/Array&String*
数组
数组优点
- 构建一个数组非常简单
- 能让我们在0(1)的时间里根据数组的下标(index)查询某一个元素
数组缺点
构建时必须分配一连续的空间
查询某个元素是否存在时需要遍历整个数组,耗费0(n)时间,其中n是元素个数
链表
单链表
链表中的每个元素实际上是一个单独的对象,而所有对象都是通过每个元素中的引用字段连接在一起
双链表
与单链表不同的是,双链表的每个结点中都含有两个引用字段
链表优点
- 灵活的分配内存空间
- 能在o(1)时间内删除或添加元素
单链表前提知道前一个链表,双链表前后都可以
缺点
- 查询元素需要o(n)时间
链表解题技巧
- 利用快慢指针(有时候需要用到三个指针)
1.链表的反转
2.选择倒数第K的指针
3. 链表中间位置的元素
4. 链表是否有环
- 构建一个虚假的链表头
1.两个排序链表,进行整合排序
2.将链表的奇偶按原定的顺序分离,生产前半部分为奇数,后半部分为偶数
栈
后进先出(LIFO)
算法基本思想
可以用单链表来实现
只关心上一次的操作
处理完上一次的操作后能在o(1)时间内查找更前一次的操作
队列
先进先出
常用的场景
- 广度优先搜索
双端队列
基本实现
- 可以利用一个双链表
- 队列的头尾两端能在o(1)的时间内进行数据的查看,添加,和删除
常用的场景
- 实现一个长度动态变化的窗口或者连续区间
树
树的共性
- 结构直观
- 通过树问题考察,递归算法,
面试中常考的树的形状
- 普通二叉树
- 平衡二叉树
- 完全二叉树
- 二叉搜索树
- 四叉树
- 特殊树:红黑树,
考题
- 遍历(前序/中序/后序)