type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 LinkedList源码分析
虽然一般都是使用ArrayList集合比使用LinkedList集合要多,但是这并不妨碍我们对LinkedList的源码研究和学习
数据结构和参数
LinkedList 是一个双向链表的结构,这点可以直接看其内部内就可以非常明显的看出来. 静态私有的内部类,只提供一个构造函数
头节点的上一个指针是Null;尾节点的下一个指针是Null
如果头节点和尾节点都是null的话,则说明该LinkedList只有一个元素

然后我们看 LinkedList 自身的变量. size 肯定是记录这个链表的长度,不然到时候node.next.next....获取长度就很得不偿失了. 然后记录了一个头节点和尾节点,个人认为这是方便遍历。从头开始遍历就从first节点获取,从尾部开始遍历的话,就从last开始获取
方法
add(E e)方法
add方法调用一个linkLast方法,然后就返回true了. 也就是说add(E e)就是默认从尾部开始插入元素进去
方法解析流程如下

add(int index,E element)根据下标添加
代码逻辑如下图:

addFirst(E e)头插入
将值插入到头部
代码逻辑如下

addLast(E)尾插入
与头节点相似,也是利用变量last来实现尾部插入
可参考上面的头插入图,也就是将头的判断和指针的指向倒过来,换成尾就是的了
get方法
根据下标来获取出值 ,然后调用node方法获取出节点,node.item就是我们需要的值,然后对其进行返回即可
参考下标添加中的图,有个node(index)的方法,get也是走的node(index)去获取的node节点;再次之前,也会进行一次index是否越界的判断
getFirst / getLast方法
可以看到first和 last都是直接从定义的变量中获取出对应的值;分别从头节点和尾节点的值获取
peek方法
使用first节点,如果是null的话就会返回null,否则就是f.item. 这里是没有删除first元素,poll是弹出元素并且删除
与 getFirst 逻辑一致,只是这里如果first是null的话就返回null,而getFirst是null的话,则会抛出异常
peekFirst和peekLast方法
peekFirst: 获取头节点元素;其实和peek逻辑是一致的
peekLast: 获取尾节点元素;从变量last获取,如果是null返回null;否则返回对应的值
poll方法
弹出第一个元素,并且将都一个元素的下个元素重置未第一个元素;如果next是null的话,则first也是null,说明当前linkedlist无元素了
这里主要看unlinkFirst方法
remove()方法
移出第一个元素,也就是和 poll 的逻辑是一致的
remove(int index)方法
根据下标进来remove方法, node(index) 也是在上面进行讲到的,就是根据下标获取对应的node节点信息
remove(Object o)
根据值来进行删除.这个可以看出来,如果有二个相同节点的值,调用一次这个方法是只可以删除一个,而不是二个
假设node节点1有二个,则你需要调用二次删除
当然你可以分别调用removeFirstOccurrence(Object o)和removeLastOccurrence(Object o)分别优先删除头和优先删除尾
🤗 总结归纳
好啦,今天的知识内容就更新到这里,虽然文字描述到很难理解,但是主要去理解 Node 节点的 双向指向,并且每次添加节点和删除添加,都是靠Node的prev和next来进行指向. 所以说LinkedList是删除快,查询慢的原因
📎 参考文章
有关文章的问题,欢迎您在底部评论区留言,一起交流~