关于LinkedList的详细阐述( 三 )

这里复杂点体现在需要判断 next 不为空和为空的场景 , 代码注释中有详细的描述 。
迭代器删除
LinkedList 在删除元素时 , 也推荐通过迭代器进行删除 , 删除过程如下:
public void remove() {checkForComodification();// lastReturned 是本次迭代需要删除的值 , 分以下空和非空两种情况:// lastReturned 为空 , 说明调用者没有主动执行过 next() 或者 previos() , 直接报错// lastReturned 不为空 , 是在上次执行 next() 或者 previos()方法时赋的值if (lastReturned == null)throw new IllegalStateException();Node lastNext = lastReturned.next;//删除当前节点unlink(lastReturned);// next == lastReturned 的场景分析:从尾到头递归顺序 , 并且是第一次迭代 , 并且要删除最后一个元素的情况下// 这种情况下 , previous() 方法里面设置了 lastReturned = next = last,所以 next 和 lastReturned会相等if (next == lastReturned)// 这时候 lastReturned 是尾节点 , lastNext 是 null , 所以 next 也是 null , 这样在 previous() 执行时 , 发现 next 是 null , 就会把尾节点赋值给 nextnext = lastNext;elsenextIndex--;lastReturned = null;expectedModCount++;}总结LinkedList 适用于要求有顺序、并且会按照顺序进行迭代的场景 , 主要是依赖于底层的链表结构 , 在面试中的频率还是蛮高的 , 相信理清楚上面的源码后 , 应对面试应该没有问题 。


推荐阅读