渣渣也来写博客——《我的第一本算法书》笔记(一)
大家好,我是一名编程小鸟,最近这几天,刚刚读完《我的第一本算法书》,觉得闲来无事,于是就打算写一些笔记打发时间,来规整一下学到的东西,好了,话不多说,进入正题。
NOTE:
一、数据结构:
(1)链表:
1.数据结构之一,其中,数据的增加删除较为方便,但访问比较耗时。
Tips:数据的操作一共分为四种:增加,删除,查找,改写。
P.S. 链表理论上来说,增加、删除的时间复杂度是O(1),但实际上为O(n),因为对目标结点进行操作,需要花费时间去查找。
2.链表一般多为“数据+指针”这种结构,用C/C++就是这样定义的:
1 typedef struct Node{ 2 Elemtype data; 3 Node *next; 4 }node;
Tips:Elemtype指的是任意数据类型,但其并没有在C/C++中定义,因为C/C++属于强类型语言,所以如果使用的话应在其前面添加一句:
1 typedef int/*这里你可以改成任何你需要储存的数据类型*/ Elemtype;
但是,一些语言是不支持指针的,如Basic、Fortran等,那他们想要做链表怎么办呢?我们的大佬们想到了一个好办法,就是用两个数组,一个数组是存数据的,一个数组是存指向的,如图:

其中,data数组中存放的是数据,而pointer数组中指向的的是下一个数据的数组下标,不得不说,大佬真的不是人,这种简单而且实用的方法都可以想得到。
3. 链表一般不是连续分布在内存中的,但是他们之间可以通过指针互相联系。
这就好比一个班的同学,住在不同的地方,但是彼此之间都有地址可以去对方家蹭饭,只不过,一个人只会有另一个人的地址,比如:A只有B的地址,但没有C的地址,B有C的地址。
所以,这就是为什么访问、查找链表某个元素的时间复杂度是O(n),因为A要去C家,必须先去B家,然后让B带着A去C家。
4. 链表元素的添加与删除:
删除:
为什么先讲删除呢?因为删除好理解。
现在我们还是拿那三个人举栗子举例子,假如说A与B的关系搞崩了,A准备和C一起把B排挤出去,于是决定先拿到C的地址,A直接从B那里复制了一份C的地址,然后把B的地址忘掉,把C的地址记住,整个过程如果用图画来表示的话是这样的:

这时候就有人问了:那B不是也指向着C吗?其实,这里的B确实被删掉了,因为没有元素指向B了,B就如同了一个实际存在但是看不见的透明人,最后,会慢慢的被其他的元素给覆盖。
增加:
继续拿那几个人举例子,这时候,D出现了,他想加入A和C的小群体中,A和C也欣然同意了,D先复制了一份C的地址并记住,然后A记住了D的地址并忘掉了C的地址,这样,D就加入这个小群体当中了,其过程如图所示:

5. 链表的种类:
链表有以下几种类型:
1、单向链表:
一个元素只有一个指针,其指针指向下一个数据的地址。如图:
其用代码定义为:
1 typedef struct Node{ 2 Elemtype data; 3 node *next; 4 }node;
2、双向链表
一个元素有两个指针,其分别指向上一个元素的地址和下一个元素的地址,如图:
其用代码定义为:
1 typedef struct Node{ 2 Elemtype data; 3 node *next; 4 node *last; 5 }node;
3、循环链表
一个元素只有一个指针,其指针指向下一个数据的地址,最末尾元素的指针指向头元素。如图:

其代码定义与单向链表一样。
——————————————————————THE END——————————————————————
好了,这就是本次笔记的全部内容,因为作者是初次写blog,没有很多经验,所以有什么不足的地方请大家在评论区下方留言。如果你喜欢本blog的话请点击下方的大拇哥谢谢。最后,关注,即可提高AC成功率,Peace!^-^

浙公网安备 33010602011771号