408数据结构算法题笔记

1.顺序表

1.快排部分

image-20251204112410880

1.快排代码

image-20251025202518381

2.快排的划分思想

空间:O(1)

时间:O(n)

image-20251025204312670

image-20251204113237092image-20251204113237092

image-20251204113111988

划分实战

image-20251204113617394

其实就是把数组分成两半,那就直接找第n/2小的元素就好了

image-20251204113720460

image-20251204113737502

3.快排实战

image-20251204112319672

image-20251204112531389

image-20251204112626611

image-20251204112708333

image-20251204112753815

2.归并排序

归并排序的合并两个数组

image-20251118183247726

image-20251204113926059

image-20251204114108713

image-20251204114220854

2.链表

image-20251204095526314

1.按位序查找

image-20251204095126802

1
2
3
4
5
6
7
8
9
//这样找中间结点更好记一点 如果是1 2 3 4 5,那么l就是3,如果是1 2 3 4 5 6,那l就是4
l = head;
r = head;
//1.找中间节点
while (r->next && r->next->next)
{
l = l->next;
r = r->next->next;
}

image-20251204095219929

也可以用两个指针,让第一个指针先移动K步

image-20251204095429362

先获得长度,然后长的减去短的,让长的先移动这个长度,然后一起往后移动

2.双指针 按关键字插入和删除

image-20251204095554939

pre始终是p的前驱,p用来判断找没找到关键字

image-20251204095642354

image-20251204095701970

常用思想:如果只说了时间复杂度,那说明大概就是时间换空间了,再加上所有数据都小于n,所以要一个辅助数组,如果出现了这个数,把这个数作为下标的数组元素标记为1

然后删除的时候使用前后指针

3.头插-原地逆置

image-20251204095846566

1
2
3
4
5
6
7
8
9
10
//头插法原地逆置
p=head;//原来链表的第一个结点
head2->next = NULL;//虚拟头结点
while (p != NULL)
{
NODE* q = p;
p = p->next;
q->next = head2->next;
head2->next = q;
}

4.尾插-保持原来顺序

image-20251204100211423

image-20251204100448053

找到中间结点然后分成两部分,把第二部分逆置,然后分别插入新的链表就行

5.2018综合实战

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
28
29
30
31
32
33
34
35
36
37
void change(NODE* head)
{
NODE head2,* l, *r, *p,*q1,*q2;
head1->next = head;
l = head;
r = head;
//1.找中间节点
while (r->next && r->next->next)
{
l = l->next;
r = r->next->next;
}
//2.和原来链表断开 l是前半段的最后一个结点
p = l->next;
l->next = NULL;
//3.头插法原地逆置后半部分
head2->next = NULL;
while (p != NULL)
{
NODE* q = p;
p = p->next;
q->next = head2->next;
head2->next = q;
}
//4.一个接着一个重排 注意下面的交替顺序
q1 = head;
q2 = head2->next;
while (q1 && q2)
{
NODE* s1 = q1;
q1 = q1->next;
NODE* s2 = q2;
q2 = q2->next;
s1->next = s2;
s2->next = q1;
}
}

3.二叉树

image-20251204100704352

image-20251204100733548

image-20251204100754902

1.遍历

image-20251204100903770

image-20251204100941525

2.高度

image-20251204101138783

image-20251204101226916

3.宽度

image-20251204101337406

4.WPL

image-20251204101606379

5.二叉排序树

image-20251204101952438

image-20251204102143701

98. 验证二叉搜索树 - 力扣(LeetCode)

这样也行

6.平衡二叉树

image-20251204102329124

image-20251204102704919

7.完全二叉树

image-20251204103211139

image-20251204103145934

4.图

image-20251204103454822

image-20251204103624076

1.图的顺序遍历-邻接矩阵邻接表存储

1.邻接矩阵

image-20251204104057410

名字随自己喜欢定义

1
2
3
4
5
6
#define MAXV 6
typedef struct{
int numE,numV;//边数和顶点数
char list[MAXV];//顶点表
int edge[MAXV][MAXV];//邻接矩阵
}G;

image-20251204104335386

image-20251204104359103

2.邻接表

image-20251204104622743

image-20251204104730491

image-20251204104755166

image-20251204105037306

3.实战21年真题

image-20251204103816893

其实就是统计一下度为奇数的个数,就是遍历个二维数组,可以说相当简单了

1.邻接矩阵

image-20251204110859519

2.邻接表

image-20251204111141607

image-20251204111218503

image-20251204111314223

4.实战23年真题

image-20251204103838690

1.邻接矩阵

image-20251204111721554

2.邻接表

image-20251204111743178

image-20251204111819866

image-20251204111902965

时间:O(v+e),空间:O(v)

2.拓扑排序

image-20251204103903978

image-20251204114746494

image-20251204114852736

3.多重链表、十字链表数据结构的定义

复习对应的第六章的部分,要知道怎么写

4.图的遍历和最短路(有时间的话看看DFS,BFS,迪杰斯特拉,弗洛伊德什么的)