-
数组
- 数组占用的内存中连续的空间。
- JAVA中的ArrayList这种数组,会在数组空间占满后,自动扩容,
- 扩容方案,就是申请一份更大的内容(应该是1.5倍大), 然后将原数组中的内容复制过去
- 所以数组的插入操作,一般的时间复杂度是O(1), 最后需要扩容时是O(n), 因为只有极端情况下才会变成O(n), 摊还复杂度是O(1)
- 如何找到数组中节点在内存中的位置
- 首节点的内存地址 + 数组下标 * 节点size
- 这也是为什么数组从0开始,因为可以减少一次 下标 - 1 的操作
-
链表
- 链表可以使用内存中不连续的内存空间
- 一般的链表是由一个链表本身的内容加上一个next的指针(指向下一个节点的内存地址)构成
- 双向链表,就是普通的链表内容中附加一个prev指针(指向该节点的上一个节点)
- 循环单向链表,单向链表的最后一个节点的next指针指向第一个元素(head)
- 循环双向列表, 就是链表的最后一个节点的next指针指向第一个元素(head), 链表的第一个节点的prev指针,指向最后一个元素;
- 链表可以使用不连续的内存空间,所以链表的插入操作,时间复杂度都是O(1)。
- 链表的算法练习题 leetCode对应编号:206,141,21,19,876
-
栈
- 栈是一种受限的数据结构
- 先进后出
- 只能将节点添加在栈的末尾
- 取元素的时候,只能从后面取
-
队列
- 队列是另外一种受限的数据结构
- 先进先出
- 将节点添加在队列的尾端
- 取元素的时候,从队列的前端取