文章目录
链表结构
说到链表结构就不得不提起数据结构,什么是数据结构?就是用来组织和存储数据的某种结构。那么到底是某种结构呢?
数据结构分为:
- 线性结构
- 数组,链表,栈,队列
- 树形结构
- 二叉树,B树,红黑树等
- 图形结构
- 邻接矩阵,邻接表等
那么链表就是我们这本文的主角,之前其实我们都接触过链表就是集合中基于List实现的linkedlist,但是在练习的过程中我发现好多同志只会用,不知道其中原理,知其然而不知其所以然。但是也会有同志说了我会用不就不就醒了,各位凡是要做到精益求精,知其然跟要知其所以然。为实现科技报国我们的祖国就需要这种人才,一起创新创建共创科技大国。
链表结构的定义
什么是链表
在逻辑结构上一个挨一个的数据,但是在实际存储时所在的内存地址却并不连续,相反数据随机分布在内存中的各个位置。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uo1YfDER-1690775932877)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731093517699.png)]](https://i-blog.csdnimg.cn/blog_migrate/4ece813f7919493b39e105c287f9581f.png)
通过数据的指针指向下一个数据,这种存储结构称为链式存储,而这种链式存储所生成的表就是链表
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-63Npk2QJ-1690775932878)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731093456452.png)]](https://i-blog.csdnimg.cn/blog_migrate/bcfabbdc957da21be1e634764f0dde99.png)
链表分类
- 单向链表
- 双向链表
- 双向循环链表
单向链表
什么是单向链表
上面说到了什么是链表,那么在单向链表中我们将数据分为两个区域
- 数据域:存储数据
- 指针域:存储下一个节点的内存地址
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFVtGpFY-1690775932878)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731095437329.png)]](https://i-blog.csdnimg.cn/blog_migrate/726a636740456f25e303a53099d38b54.png)
在链表中它有一个专业名字叫做:节点。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4HrBVGMO-1690775932879)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731095418610.png)]](https://i-blog.csdnimg.cn/blog_migrate/c9521a336ff2c8c35f748408503f5deb.png)
一个节点指向下一个节点,这种链式结构称为单向链表
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DaVYtHbB-1690775932879)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731095536584.png)]](https://i-blog.csdnimg.cn/blog_migrate/1d74edb99ca017db1412502a3fd04682.png)
在单向链表中,链表的第一个节点称为首元节点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVWMVy6h-1690775932880)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731095809932.png)]](https://i-blog.csdnimg.cn/blog_migrate/e286fdbc9f471ed77bcbeb0d60432e1e.png)
链表的最后一个节点称为尾节点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RExs1D0C-1690775932880)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731095856557.png)]](https://i-blog.csdnimg.cn/blog_migrate/059130f4b2bc91cfc2ac81bb042e475f.png)
中间的这个节点的前一个节点称为前驱

中间的这个节点的后一个节点称为后继
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mg6JU2zh-1690775932881)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731100047613.png)]](https://i-blog.csdnimg.cn/blog_migrate/0ba303550df477a59644ea374f9f3349.png)
通常在链表的前面会有一个节点称为头节点,当然头节点不是必须存在的。
- 头节点的作用是:用来存储链表的长度
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jXLTPxvG-1690775932882)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731100239606.png)]](https://i-blog.csdnimg.cn/blog_migrate/72cc7836bdb191548b36ccc2602fca40.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29rianmB-1690775932882)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731100320069.png)]](https://i-blog.csdnimg.cn/blog_migrate/6aff3375e0e3d43beeee01307994b137.png)
在每一个链表中都会配备一个头指针,指针始终指向第一个节点,如果有链表中配备头节点则指向头节点,如果没有配备头节点则指向首元节点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTTJDnYf-1690775932883)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731100533063.png)]](https://i-blog.csdnimg.cn/blog_migrate/907c1c6c2a90f842804ae96634f3c176.png)
头指针的定义是:用于在链表中挪动指针查找数据,直到找到对应的数据

单向链表的功能
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FPscmp6z-1690775932884)(E:\Java笔记\数据结构\线形结构\链表结构.assets\image-20230731103625505.png)]](https://i-blog.csdnimg.cn/blog_migrate/121ff7402c549db9ee4c33fa99982d65.png)
-
增
-
向链表的尾节点添加节点
-
将新添加节点的内存地址存放到该链表尾节点的指针域中。通俗的讲:将尾节点的指针域指向新添加的节点
-
此时尾节点就是新添加的这个节点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EOecEUmO-1690775932884)(E:\Java笔记\数据结构\线形结构\链表结构.assets\20230731_104622.gif)]](https://i-blog.csdnimg.cn/blog_migrate/3148282bf775e80a08585e80db55d8e2.gif)
-
-
向链表的首元节点之前添加节点
-
将链表的首元节点的内存地址存放到新添加节点的指针域中。通俗的讲:新节点的指针指向首元节点
-
此时首元节点是新添加的这个节点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NGbrG5IA-1690775932885)(E:\Java笔记\数据结构\线形结构\链表结构.assets\20230731_105455.gif)]](https://i-blog.csdnimg.cn/blog_migrate/04e6a3abfb6faec35c3fb0f9cde0ff6b.gif)
-
-
向链表中间添加节点
- 将新添加节点的内存地址存放到前驱的指针域中,新添加节点的指针域存放后继的内存地址。通俗的讲:修改前驱的指针方向指向新添加的节点,新添加的节点执行后继即可
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4JmT2yty-1690775932885)(E:\Java笔记\数据结构\线形结构\链表结构.assets\20230731_110227.gif)]](https://i-blog.csdnimg.cn/blog_migrate/9b8f5d866611d702e66e9343540f5a51.gif)
-
-
删
-
删除尾节点
- 尾节点的前驱的指针域不在存储尾节点的内存地址。通俗的讲:尾节点的指针域不在指向尾节点
-
删除首元节点
- 首元节点的指针域不存放后继的内存地址。通俗的讲:首元节点的指针与不在指向后继节点
-
删除中间的某个节点
-
删除节点的前驱指针域不再存放删除节点的内存地址,删除节点的指针域不再存储后继的内存地址,通俗的讲:删除节点的前驱指向删除节点的后继
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK3f0kcV-1690775932886)(E:\Java笔记\数据结构\线形结构\链表结构.assets\20230731_110948-16907732210771.gif)]](https://i-blog.csdnimg.cn/blog_migrate/c0940151688902a41904ba1a6152166f.gif)
注意:被删除的节点称之为:野节点,这并不是真正意义上的删除,它在内存中依旧存在。那么野节点的最终归宿是被JVM的GC(垃圾回收器)所回收,也就是释放该节点的内存空间,这才是真正意义上的删除
额外知识:java中的垃圾回收器(Garbage Collector,GC)负责管理内存的分配和释放。当一个对象没有任何引用指向它时,它就变得不可达,而垃圾回收器会将其标记为垃圾对象,并在适当的时候回收该对象所占用的内存空间。这个过程称为垃圾回收。
-
-
-
改
- 挪动指针找到要修改的节点,之后讲修改节点的数据域中的数据修改掉
-
查
- 挪动指针找到要所要查找的数据。
特点
-
节点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。
-
数据元素的个数可以自由扩充,插入,删除,只需要修改节点的指针方向,效率高
-
修改和查找节点数据需要挪动指针,按照节点的顺序进行依次查找或者修改,效率比较低
与数组的区别
回顾数组
数组的功能
-
增
- 数据不能超过定义的数组长度
- 数据少于定义数组的长度会造成内存浪费
- 数组中间添加数据会将之后的数据内存位置往后挪动

本文介绍了链表的基础知识,包括链表的定义、分类,重点讲解了单向链表的概念、特点以及与数组的区别。详细阐述了单向链表的增、删、改、查操作,并探讨了链表节点的内存管理,尤其是删除节点后的“野节点”处理。同时,提到了Java中的垃圾回收机制在回收链表节点内存中的作用。
最低0.47元/天 解锁文章
12万+

被折叠的 条评论
为什么被折叠?



