![760908bf2dab46dfcdaaf461eda75d7d.gif](https://i-blog.csdnimg.cn/blog_migrate/97a9b0965a44f3f1d99c821cb878fa79.gif)
阅读本文约需要10分钟,您可以先关注我们或收藏本文,避免下次无法找到。
之前我们通过趣味图解法为大家介绍了二分查找的算法,今天我们一起来学习日常工作中经常能用到的算法链表。
成哥就是通过这个算法解决了网络ACL策略配置前后插入下发的问题。
01 简介
链表就是链式存储的线性表,它最大的优点在于可以有效利用零碎的内存空间,根据链表指针域的不同链表分为单向链表、双向链表等。
其实Python语言的列表类型的工作原理就是链表。本文章中我们将通过Python来模拟链表结构。但由于Python没有指针概念,我们将通过模拟指针的方法来实现链表。
02 单向链表
(1)单向链表简介
链表的每个元素不仅要存储这个元素值还要存储与这个元素相连的元素的指针值,这样才能实现链表的串联。
单向链表的每个元素包含一个本身的值和一个指向下一个数的指针。
这边要注意一下链表最后一个元素是没有指针的所以其指针为空指针。
![34ed34af80a3f8875e472b7a39bf5f0b.png](https://i-blog.csdnimg.cn/blog_migrate/36b6091cf95b88a7185d4b49c973577d.jpeg)
如上图,从第一个元素开始,跟着指针箭头走直到没有存储下一个元素指针的最后一个数60为止,就完成了单链表的遍历。
好了我们现在了解了单链表的大概实现原理,现在我们看看如何用python代码来实现链表,具体代码如下:
![b79ea5a8d3dcaf374ba19c3d077d2f6d.png](https://i-blog.csdnimg.cn/blog_migrate/3466d39a646c48848a4b1bae7a3c2ff5.jpeg)
输出结果如下:
![8b5eac1df18d09cd7c4da34157298c14.png](https://i-blog.csdnimg.cn/blog_migrate/76dc48a6599893dc88e83afd84225060.jpeg)
(2)单向链表元素插入
上面章节我们了解了单向链表的实现原理,本章节我们看看单向链表怎么添加元素。如下图我们该怎么把元素35插入30与40这两个元素之间呢?
![3061caf04270aa43d5eedf222bf71d2f.png](https://i-blog.csdnimg.cn/blog_migrate/47bcb0b03facbc168b428fe960324b75.jpeg)
好了不卖关了我们可以先把35元素的指针指向它所要插入的位置后面一个元素40,如下图所示
![6bc84610ef0943be722109c8513a1f82.png](https://i-blog.csdnimg.cn/blog_migrate/ede7f0469c627526d1df1b7dd6395e73.jpeg)
接着把需要插入元素前面的元素指针指向该元素,也就是把30的指针指向35,这样就完成了链表的插入如下图所示
![b1b5118858eb0a11bcfcce72299d73e4.png](https://i-blog.csdnimg.cn/blog_migrate/65c33dca5258881829e8243486567cc6.jpeg)
这时肯定会有读者问为什么要先把新插入元素的指针指向后一个元素,可不可以先把前一个元素30的指针指向35,其实答案是不可以的,当我们先把元素30的指针指向35,这时新元素35还没指向任何元素这将导致链表的断链,具体如下图所示:
![844d13b2f5d550db3443c780053320b0.png](https://i-blog.csdnimg.cn/blog_migrate/a9e7aa307f827bd177c9273a698909f4.jpeg)
下面我们看看如何通过代码实现链表元素的插入吧,代码示例如下:
![ea9d55a39e9e039443cd003bc54b46fd.png](https://i-blog.csdnimg.cn/blog_migrate/c52e8e3e584f68388834660f8a93cc51.jpeg)
输出结果如下:
![08f4ab6cf858a1495d480b0a2d595044.png](https://i-blog.csdnimg.cn/blog_migrate/7724a22873ccfbd09e7b7b852a8180b5.jpeg)
(3)单向链表元素删除
如下图我们可以发现单向链表元素删除非常简单,直接通过当前元素指向下一个元素的指针来找到下一个元素位置,然后把这个位置赋值给当前元素的指针,这样当前元素的指针就会跳过下一个元素直接连接了下下个元素,这就完成了元素的删除具体如下图:
![86741859e3e2206fb1c6cbc7e9fb9873.png](https://i-blog.csdnimg.cn/blog_migrate/187d28076847d5157877533ac73581f3.jpeg)
单链表元素的删除具体代码实现如下:
![734fff2d94e95c8cb55eea76d0be4297.png](https://i-blog.csdnimg.cn/blog_migrate/4b8b98277716f60ca16dd98b17def09e.jpeg)
代码输入如下,可以发现元素50已经被删除,同时链表也可以正常按顺序输出:
![bbf17cc15ec7b18755e227ae843b9373.png](https://i-blog.csdnimg.cn/blog_migrate/850027dbe0f4e3048c1832aef04ac91b.jpeg)
03 双向链表
(1)双向链表简介
上面我们讲了单链表,现在我们一起来学习一下链表的另一种类型双链表,双链表的每个元素是由它的值和两个指针组成,一个指针指向上一个元素,一个指针指向下一个元素。双链表比起单链表的优势是可以进行双向遍历,如下图所示:
![011e9878da567f976dea3a2b3596b39c.png](https://i-blog.csdnimg.cn/blog_migrate/70d284d180c464020be651cb8c6a4f62.jpeg)
下面我们就通过Python代码来模拟一下双向链表的双向的链表输出
![d481d0b37c9dd8f3b6c06e061f6bb1a7.png](https://i-blog.csdnimg.cn/blog_migrate/2638abecc3a5f844185bd933d64d50df.jpeg)
代码运行结果输出如下:
![d057e47edb113f5ef701fa4271b6ce21.png](https://i-blog.csdnimg.cn/blog_migrate/7287487654208dd7f8324757501b4705.jpeg)
(2)双向链表元素插入
通过上面章节我们了解了双向链表的实现原理,现在我们再来看看对双向链表进行元素插入吧。
![ff06e384b8d9415ab0c7aea3eda08927.png](https://i-blog.csdnimg.cn/blog_migrate/71131626e85e486ae929fe5edeb2766a.jpeg)
如上图第一步我们先对新插入的元素的两个指针赋值,分别将它们指向插入位置的后一个元素与前一个元素,接着第二步将后一个元素前指向指针与前一个元素后指向指针赋值指向新插入的元素,这样我们就完成了双向链表的元素插入。双链表比起单链表好处就是可以通过知道上一个元素的位置来插入新元素,也可以通过知道下一个元素的位置来插入新元素。在日常工作中双向链表适用范围比单向链表广,之前我们项目中就是用的双向链表来对ACL策略进行配置顺序调整的。
下面我们通过Python代码来实现双向链表的元素插入吧
![8f8d5347a25a2a62b4e851a0a6d6ce86.png](https://i-blog.csdnimg.cn/blog_migrate/a23dad78e47e8f8b3694d2131a4066ac.jpeg)
代码执行结果如下,发现链表插入元素35后正反向都能正确进行遍历
![70f735ea9f67277c2f795771ebdab73c.png](https://i-blog.csdnimg.cn/blog_migrate/9bc8b85eb0d232076b3640871ffafded.jpeg)
(3)双向链表元素删除
双链表的删除其实和单向链表类似,我们要知道删除元素的前一个数的位置,然后通过要删除的元素来确定下下一个元素的位置,最后直接连接要删除的元素的前后两个数就完成了删除,如下图所示:
![a19b251878c8341a4aa7d81c11783820.png](https://i-blog.csdnimg.cn/blog_migrate/8b2066aa8d5bd3c5a8ca90970df06864.jpeg)
现在我们看看如何通过代码实现双向链表的元素删除吧
![136dda4fce963ffadce43f8983801fcf.png](https://i-blog.csdnimg.cn/blog_migrate/c25979d234cf527b5302e8f280cfda99.jpeg)
代码输入结果如下,发现元素35已经正确的删除了
![878bbca260ade857f9476f0601d171fc.png](https://i-blog.csdnimg.cn/blog_migrate/acb83deaa16cd2519b1944259525f0fd.jpeg)
至此我们的链表算法就讲完了,如果大家喜欢不要忘了点击@IT管理局关注、点赞与收藏哦!
本局精彩文章:
- 趣味图解算法之二分查找
- Wireshark数据包分析三板斧
- IT工程师都需要掌握的容器技术之扫盲篇