今天开始,学习 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变量就行。
好了,删除头和尾节点,我们这里就结束了, 现在还剩一个 删除指定的节点。