渣渣也来写博客——《我的第一本算法书》笔记(一)

大家好,我是一名编程小鸟,最近这几天,刚刚读完《我的第一本算法书》,觉得闲来无事,于是就打算写一些笔记打发时间,来规整一下学到的东西,好了,话不多说,进入正题。

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!^-^

posted @ 2020-08-27 22:53  Larry83  阅读(43)  评论(0)    收藏  举报