数据结构
1、线性结构
线性结构中的数据元素是按顺序排列的,每个元素有唯一的前驱和后继。
1.1 数组(Array)
- 定义:一组固定大小、类型相同的元素集合
- 特点:支持随机访问,时间复杂度为𝑂(1)
- 缺点:插入和删除操作效率较低(需要移动元素)
1.2 链表(Linked List)
- 定义:由节点组成,每个节点包含数据和指向下一个节点的指针
- 类型:单链表、双链表、循环链表
- 特点:动态内存分配,插入和删除效率高,但随机访问较慢
1.2 栈(Stack)
- 定义:后进先出(LIFO)的数据结构
- 操作:push(入栈)、pop(出栈)
- 应用:函数调用、表达式求值、括号匹配等
1.3 队列(Queue)
- 定义:先进先出(FIFO)的数据结构
- 类型:普通队列、双端队列(Deque)、优先队列(Priority Queue)
- 应用:任务调度、消息队列等
2、非线性结构
非线性结构中的数据元素可能有一个或多个前驱和后继。
2.1 树(Tree)
- 定义:由节点和边组成的层级结构,每个节点有一个父节点和多个子节点
- 特殊类型:
- 二叉树:每个节点最多有两个子节点
- 完全二叉树:叶子节点尽量集中在左侧
- 二叉搜索树(BST):左子树节点值小于根节点,右子树节点值大于根节点
- 平衡树:AVL树、红黑树
- 应用:文件系统、语法解析、数据库索引(B树/B+树)等
2.2 图(Graph)
- 定义:由顶点(Vertices)和边(Edges)组成的数据结构
- 类型:
- 无向图、有向图
- 权重图:边有权重
- 表示方法:邻接矩阵、邻接表
- 应用:网络路由、社交网络分析等
3、哈希表
- 定义:通过哈希函数将键映射到数组中的位置以存储数据
- 特点:查找、插入、删除操作的平均时间复杂度为O(1)
- 解决冲突的方法:链地址法、开放寻址法
- 应用:字典、缓存等
4、数据结构的选择
- 数据量的大小
- 数据的插入、删除、查找频率
- 算法对时间复杂度和空间复杂度的要求
- 数据的特性(是否有顺序、是否重复等)
链表
链表介绍
- 线性结构。 数组、链表。 数组在内存中是连续的,所以通过下标查找性能好,但是删除和新增会导致整个数组变化性能反而不好。链表就反之。
- 非线性结构。树、堆。
反转链表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27//题目
输入:1->2->3->4->null;
输出:4->3->2->1->null;
//思路
1. 把当前节点的next属性指向它的前一个节点
//实现
function listNode(val){
this.val = val; //当前节点
this.next = null; //该节点指向下一个节点
}
const reverseList = function (list){
if(list === null || list.next === null){
return list;
}
let pre = null, cur = list;
while(cur !== null){
let next = cur.next; //保存临时变量
cur.next = pre; //当前节点next指向前一个
pre = cur;
cur = next;
}
return pre;
}
删除链表中第N个节点
算法
洗牌算法
1 | //要求:新生产的数组元素下标和原数组元素下标不能重复 |
判断正整数是否对称
1 | //要求:12321、 1234321 |
判断10进制整数包含多少个n[0 - 9]
1 | //要求: 不能通过转换为String,然后通过循环来判断 |
寻找重复数
1 |
|
寻找2个字符串最大公共子串
1 | //要求: |
对比版本号大小
1 | //思路 |
爬楼梯算法
1 | //题目 |
有序数组旋转求出最小值
1 | //题目 |