前言:会尽量用简洁和通俗易懂的语言来分享我对链表的理解
正文
链表的概念:是一种动态线性数据结构(可随时扩展或缩小),由一个或多个节点通过指针连接而成
而节点又包括两个部分:
1.数据域:存储数据的
2.指针域:存储指向前一个或者后一个指针的地址
链表也分种类,等会细讲
通俗易懂来讲⬇️
可以把链表理解成火车,一节节车厢则是节点,指针则是每节车厢的连接钩,车尾的节点(尾节点)为空(NULL,代表结束)
Python暂时还没有内置方法,得手动创建链表类,但是Java有一个LinkedList(双向链表)的方法
应用场景:频繁插入/删除操作
链表的操作也是增、删、改、查四大类
优势:增/删效率高
缺点:不能任意访问,只能顺序访问,所以得从头遍历
原理╭☞(  ̄ ▽ ̄)╭☞
- 一辆火车(链表),你想插入一节车厢(节点)(增),只需要断开前后车厢的连接钩(指针),插入新的车厢,再进行连接,无需移动前后车厢位置
- 有节车厢不要了,先断开这节车厢(节点)前后的连接钩(指针),移除该车厢(释放内存资源)(删),再将前后车厢连接起来,其过程也不需要移动前后车厢位置
- 有节车厢(节点)里面装的是可乐(存储的数据),想把可乐换成雪碧,直接将车厢里面的可乐换成雪碧就好了(改),不需要调整车厢之间的连接关系
- 某车厢(节点)有一个💣,而你要找出来,就只能从火车头(头节点),一个一个往后找(查),而不能直接跳到某个车厢查看
这串代码看不懂没关系,
其实我也不懂A相当于是火车头(头节点), ListNose(1)相当于是火车头里面的装载的东西(存储的数据),以此类推B,C,⚠️这里的None是作为停止条件的,“next”相当于前后车厢连接钩(指针),假设我要想得到3结果,我就得从A通过next(指针)访问到B,B再访问到C
链表的种类:
单向链表,双向链表,循环链表,循环双链表
⚠️:“→”这个箭头叫后继指针
“←”这个箭头叫前驱指针
单向链表:
优点:插入/删除高效
缺点:查找慢,无法回溯,只能从头遍历到尾
双向链表:
优点:双向遍历(可以从头或者从尾开始遍历)
OS:突然想到一个应用场景:浏览器页面的前进后退
缺点:插入/删除慢
循环单向链表:
循环双向链表:
更深入的地方以后会补充,然后文章有不对的地方,希望大家可以指出😊