1.知识点
1.内存的工作原理
2.数组与链表的原理
3.链表的几种形式
4.数组与链表的优缺点
2.内存的工作原理
计算机就像是很多抽屉的集合体,每个抽屉都有地址。
需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。
3.数组
数组(Array)是有序的元素序列。组成数组的各个变量称为数组的分量,也称为数组的元素
数组的元素带编号,编号从0而不是1开始
元素的位置称为索引
假设你要编写一个管理待办事项的应用程序,
为此需要将这些待办事项存储在内存中
我们首先尝试使用数组,所有待办事项在内存中都是相连的。
假设你要添加第四个待办事项,但后面的那个抽屉放着别人的东西
此时你需要请求计算机重新分配一块可容纳4个待办事项的内存,
再将所有待办事项都移到那里
从这个例子可以看出来 数组存储比较麻烦
4.链表
与数组相比链表的主要区别在于其中的元素可存储在内存的任何地方。(存在head 和 tail)
链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
在链表中添加元素很容易:只需将其放入内存,并将其地址存储到前一个元素中。
4.1链表的几种形式
1.单向链表:
单向链表也叫单链表,是链表中最简单的一种形式,
它的每个节点包含两个域,一个信息域(储存元素)elem和一个链接域next。这个链接指向链表中的下一个节点,
最后一个节点的链接域则指向一个空值。
2.单向循环链表:
单链表的一个变形是单向循环链表,链表中最后一个节点的链接域不再为None,而是指向链表的头节点。
3.双向链表:
一种更复杂的链表是“双向链表”或“双面链表”。
每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。第一个head和最后一个的next?
5.数组和链表进行比较
5.1 查找元素
需要查找元素时,数组往往更加便捷。例如我们想要查找当日的第三个事项。在数组中我们只要按照索引2即可查到,而在链表中我们要从头开始搜索,因为我们不知道下一个事项的存储位置。
5.2 插入元素
需要在中间插入事项时,数组和链表哪个更好呢?
1.使用链表时,插入驶向很简单,只需修改它前面的那个事项指向的地址。找个地方储存一个新的元素,可以把原来的地址改成现在新的
2.而使用数组时,则必须将后面的元素都向后移
如果没有足够的空间,可能还得将整个数组复制到其他地方!因此,当需要在中间插入元素时,链表是更好的选择。
5.3删除元素
如果你要删除元素呢?链表也是更好的选择,因为只需修改前一个元素指向的地址即可。而使用数组时,删除元素后,必须将后面的元素都向前移。不同于插入,删除元素总能成功。如果内存中没有足够的空间,插入操作可能失败,但在任何情况下都能够将元素删除。
下面是常见数组和链表操作的运行时间
需要指出的是,仅当能够立即访问要删除的元素时,链表删除操作的运行时间才为O(1)
6.数组和链表的优缺点
1.数组的优点
内存空间占用的少
数组内的数据可随机访问
2.数组的缺点
增添元素困难,增添后需要移动数组内所有元素的位置
预留内存易造成浪费,例如在之前的情境中,可以提前请计算机提供10个位置。但你额外请求的位置可能根本用不上,这将浪费内存
3.链表的优点
可动态添加删除 大小可变
链表是分散的内存空间地址,相比数组可扩展性更好
4.链表的缺点
链表内的元素不具备随机访问性
链表节点会附加上一元素或下一个元素的信息。但是数组在建立时就固定了,因此链表内存空间占用更多
7.具体代码可以看接下来这些内容