这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
一、数组
- 基础概念:
- 数组内元素的个数确定(数组创建时指定)
- 数组中元素在内存中存放,需要一块连续的内存空间
- 查询效率高,因为数组在内存中是连续的;
- 插入和删除效率低,插入数据时后面的数据都要向后面移动,因为数组是连续的因此它的读取速度快
- 数组的空间是从栈分配的
- 特点:连续内存地址,有下标
- 时间复杂度:
- 查找时间复杂度 O(1)
- 插入时间复杂度 O(n) 最后元素O(1) 平均O(n/2)=O(n)
- 删除时间负责度 O(n) 最后元素O(1) 平均O(n/2)=O(n)
二、单向链表
- 基础概念:
- 链表内元素内个数可以动态扩展
- 链表中元素在内存中任意存放,不要求连续
- 查找效率低,因为必须要知道它前一个元素的位置,所以需要从第一个开始查
- 插入和删除效率高,比如要增加一个数据到某个位置它只需要知道它前一个位置的原来后一个位置的内存地址就可以了(插入第三个位置,只要知通第二个位置原来第三位置的内存地址就可以了)
- 链表的空间是从堆中分配的
- 特点:
Node: value + next- value + 后续指针next
- 时间复杂度:
- 查找时间复杂度: O(n)
- 插入时间复杂度: O(1)
- 删除时间负责度: O(1)
三、双向链表
- 特点:
Node: value + next + pre- value + 后续指针next + 前序指针pre
- 时间复杂度:
- 查找时间复杂度: O(n)
- 插入时间复杂度: O(1)
- 删除时间负责度: O(1)