LinkList底层实现原理

简介: LinkList底层实现原理

上篇我们讲到了ArrayList,今天我们来讲讲LinkList,首先我们知道LinkList是基于双向链表实现的(1.7是双向链表,1.6是双向循环链表),啥是双向链表呢,下面这俩图分别是1.7和1.6的LinkList底层结构:


双向链表:


双向循环链表:


所以其实最基本的结构是这样的,每个节点都有一个前,一个后的指向和item本身存的东西:

咱们是基于1.7的在介绍的,大致的结构最后是这个样子,比较清晰:

小编看到这个图,突然感觉没啥可讲的了,一下子啥都明白了,咱们详细看下他的增加元素(add方法)的具体步骤吧,首先得新增第一个节点的时候,first和last都指向了第一个节点:

第二次增加元素的时候,把第一个节点的next指向了第二个节点,把第二个节点的prev指向了第一个节点,然后把last指针指向了第二个节点。

以此类推第三个元素增加的时候,也是这么操作,相比于ArrayList有没有感觉很简单,不涉及什么扩容啊,元素的复制啥的,就改个前后指针就好了

然后咱们在看看删除(remove方法从头部开始删除元素)是怎么处理的,如果LinkList只有一个元素,删除就直接将item设置成null就好了。

如果LinkList不止一个元素的时候,比如这个样子的,我们要删除他的第一个元素:

就可以将fist指针后移,将第一个节点的next置空,第二个节点的prev也置空就完成了一个节点的删除,是不是也比ArrayList简单,没有什么元素的复制:

再来思考一个问题,为什么说ArrayList的查找效率高?直接可以随机查找,数组下标获取数据,LinkList却要从头或者尾开始一个一个遍历查找(有个元素索引判断,索引是否大于链表长度一半,大于就从后往前,小于就从前往后)没错,算一个原因。还有一个原因,数组知道吧,数组在内存上是一块连续的存储空间,链表可以是不连续的,当同样都是从头开始,查第100个元素的时候(不用数组下标找,遍历的方式),那肯定连续的存储空间找的更快吧。


这时候应该都明白为啥老让比较ArrayListLinkList的区别吧,为啥老说,ArrayList的查找效率高,而增删操作的效率低,增删的时候复制数组元素没有LinkList直接改前后节点的指针快。从使用内存空间的角度来说,因为链表可以不连续,LinkList更节省,可以见缝插针,ArrayList则需要一整块的内存空间。所以随机访问比较多的时候用ArrayList,元素操作比较多的时候用LinkList。


最后,大家想获取更多知识的,可以继续关注公众号,不定时推送。分享了这么牛逼的知识,还不请小编喝个水吗,哈哈哈,欢迎土豪直接赏赞,谢谢,您的支持就是小编最大的动力。

相关文章
|
存储 Cloud Native Linux
C++ vector底层实现原理
C++ vector底层实现原理
|
存储 Cloud Native Linux
C++ deque底层原理
C++ deque底层原理
|
7月前
|
C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(下)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
54 3
|
7月前
|
编译器 测试技术 C语言
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现(上)
从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现
52 0
|
7月前
|
缓存 算法 搜索推荐
【数据结构】链表(单链表与双链表实现+原理+源码)
【数据结构】链表(单链表与双链表实现+原理+源码)
|
7月前
|
存储 编译器 C语言
【数据结构】深入浅出理解链表中二级指针的应用
【数据结构】深入浅出理解链表中二级指针的应用
117 0
|
7月前
|
存储 C语言
如何实现双向循环链表
如何实现双向循环链表
98 0
|
Java C语言
Java实现链表
Java实现链表
|
存储 C++ 容器
C++ 链表,链表各种方法实现原理
C++ 链表,链表各种方法实现原理