03-链表(单向链表)
2019-08-26 本文已影响0人
ducktobey
在上一节,我们知道了动态数组实现的大概原理,不过,动态数组却有一个明显的缺点,即可能会造成内存空间的大量浪费。因为当动态数组空间使用完以后,会申请一个更大的空间,用来保存数据,但是更大空间的数组,却不一定能全部使用,因此可能造成空间浪费。
🤔能否做到用到多少就申请多少内存呢?
有!链表就可以做到这一点。
-
链表
例如我们添加一个元素,会首先为则个元素分配存储空间,并且在链表中存储数据,会首先创建出一个node节点对象,其中内部会有一块存储空间,用来保存要存储的数据,例如下图是一个首节点链表是一种链式存储的线性表,所有元素的内存地址不一定是连续的;
![](https://img.haomeiwen.com/i1514956/8e5ed9658e03472a.png)
![](https://img.haomeiwen.com/i1514956/1c21d36bf78a68c8.png)
![](https://img.haomeiwen.com/i1514956/3e3a49ffd1ca2522.png)
所以,由于每次添加一个元素,都是新分配的内存空间,说一每个节点之间的内存地址并不一定是连续的。
当某个节点是尾节点时,尾节点的下一个Node地址将指向null,用图形表示如下![](https://img.haomeiwen.com/i1514956/40093b8fae7c3430.png)
-
链表的设计
链表中应该包含的元素
-
size - 保持链表的大小
-
first - 指向链表的头节点
![](https://img.haomeiwen.com/i1514956/37f7132255d23144.png)
一个完整的链表,用图形表示如下
![](https://img.haomeiwen.com/i1514956/897a5251a8d3a2b8.png)
了解了链表的设计以后,我们就可以来了解一下链表的接口设计了。
-
链表的接口设计
小提示:在阅读该小节时,建议结合demo源码进行同步阅读效果更佳,demo源码地址
由于链表和动态数组都是线性表,因此链表的大部分接口和动态数组是一致的,但实现方式不一样。因此我们可以将链表和动态数组的接口统一申明到接口文件中,关系如下![](https://img.haomeiwen.com/i1514956/23505c4eb4cf88b9.png)
![](https://img.haomeiwen.com/i1514956/3b489389d83055de.png)
至此,链表的接口设计就完成了,接下来再来了解一下接口的实现
-
清空链表 - clear()
![](https://img.haomeiwen.com/i1514956/a4256ae4ac25808c.png)
我们需要做的事情就是
-
将size设置为0
-
将LinkedList对象中的first字段设置为null,当我们将first设置为null时,相当于头节点没有引用指向它,头节点的内存就会被系统回收,然后后节点依次被系统销毁
1566311205757.png
🤔这里的next需要设置为null吗?
-
添加节点 - add(int index, E element)
![](https://img.haomeiwen.com/i1514956/d77ae0b495cb4555.png)
操作步骤如下
-
将新节点的next指向Node为1的节点
1566311664168.png
-
然后再让Node为1节点前面的节点里面的next指向新的节点
1566311737348.png
-
最后更新索引,就完成了节点的添加
1566311790460.png
![](https://img.haomeiwen.com/i1514956/e116fbfcf230067b.png)
因此,编写链表的过程中,要注意边界测试,如index = 0、size - 1、size时
-
删除元素 - remove(int index)
假设有以下一个链表对象,其中我们要删除Node为1的节点1566313216717.png
![](https://img.haomeiwen.com/i1514956/ed4d2ea237564c0a.png)
![](https://img.haomeiwen.com/i1514956/468facc2a4d1d472.png)
删除节点具体步骤
-
找到被删除节点的前一个节点
-
将前一个节点中的next赋值为下被删除节点的next即可
好工具分享-推荐一个神奇的网站给大家 数据结构和算法动态可视化 ,又兴趣的读者可以去看看,非常推荐
链表练习题 - 题目来自leetcode
本节完!