java集合类源码详解-LinkedList(6)-基于JDK8

今天开始,学习 LinkedList的删除 方法的底层源码。打上断点,这里我们先看看运行结果,再打上断点

点击下一步。这里又出现了 一种 常见的现象了,实际实现移除功能的是unlinkLast()方法。这里先把尾指针的引用给 l ,

此时变量 l  就是尾指针。 下面有个 if 判断,如果尾指针为null 就抛异常。

点击下一步,进入unlinkLast()方法。这里会先把,尾节点保存的元素赋给一个 element变量保存。

再次点击下一步。用一个变量 prev 来引用 尾节点的前一个节点。

 

再次点击下一步。

把尾节点保存的元素 赋为空,元素为什么能赋为空?因为 节点的 元素是Integer类型。

然后把 l 的前置节点引用也赋为空,那么尾节点就 不指向前置节点了。

再次点击下一步。此时把尾指针,指向现在新的尾节点, 这个新的尾节点也就是旧的尾节点的前置节点,

再次点击下一步。这里判断 prev 是否为null,也就是判断 最开始链表是否只有一个节点,唯一的节点的删了,那么链表就为空了,那么first 就等于 null了。 这里我们肯定是false。

 

再次点击下一步。此时把新的尾节点的next 赋为null就可以了。尾节点没有下一个节点,所以next为null。

最后size--,都是些老套路,

 

到这里,我们的这个方法就结束了,我们现在打开注释,看删除第一个节点的情况。

方法肯定就是removeFirst(),打上断点

 点击下一步。这个方法和 removeLast()的套路一样,我们不看了。

直接点击下一步。这里把第一个节点的保存的数据用element 这个变量来保存。其实这个跟unlinkLast() 套路差不多。

 

再次点击下一步,这里需要把  第一个节点的next,也就是 用一个next变量保存第二个节点。

再次点击下一步。然后把 第一个节点保存的数据和 next 都赋为null。

 

再次点击下一步。 然后把 first 指向新的第一个节点。

再次点击下一步。这里会判断是否 next 为null,也就是一开始是否 链表只有一个节点,如果是这样那么first 为null(上一个截图),last也为null。 这里我们是false。

 

再次点击下一步。

这里会将新的第一个节点的前置 指向赋为null,因为是第一个节点,他是没有前置节点的。然后最后三句话,老套路,我们就不看了。最终返回element变量就行。

 

好了,删除头和尾节点,我们这里就结束了, 现在还剩一个 删除指定的节点。

猜你喜欢

转载自blog.csdn.net/qq_37889257/article/details/84936082