|
|
|
|
移动端

3.5 LinkedList类的实现(2)

《数据结构与算法分析:Java语言描述(原书第3版)》第3章表、栈和队列,本章讨论最简单和最基本的三种数据结构。实际上, 每一个有意义的程序都将显式地至少使用一种这样的数据结构, 而栈则在程序中总是要被间接地用到, 不管我们在程序中是否做了声明。本节为大家介绍LinkedList类的实现。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 17:38

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


3.5 LinkedList类的实现(2)

图3-29指出删除一个节点的逻辑过程。如果p引用正在被删除的节点, 那么在该节点被断开连接和可以被虚拟机回收之前只有两个链改动:

图3-30显示基本的私有remove例程, 该例程包含上述两行代码。

图3-31包含前面提到的私有getNode方法。如果索引表示该表前半部分的一个节点, 那么在第16行到第18行我们将以向后的方向遍历该链表。否则, 我们从终端开始向回走, 如图中第22行到第24行所示。

如图3-32所示, LinkedListIterator具有类似于ArrayListIterator的逻辑, 但合并了重要的错误检测。该迭代器保留一个当前位置, 如第3行所示。current表示包含由调用next所返回的项的节点。注意, 当current被定位于endMarker时, 对next的调用是非法的。

为了检测在迭代期间集合被修改的情况, 迭代器在第4行将迭代器被构造时的链表的modCount存储在数据域expectedModCount中。在第5行, 如果next已经被执行而没有其后的remove, 则布尔数据域okToRemove为true。因此, okToRemove初始为false, 在next方法中置为true, 在remove方法中置为false。

hasNext是一个简单的例程。和在java.util.LinkedList的迭代器中一样, 它不检查链表的修改。

next方法在获得(第17行)将要返回(第20行)的节点的值后向后推进current(第18行)。okToRemove在第19行被更新。

最后, 迭代器的remove方法如第23行至第32行所示。该方法主要是错误检测(这就是为什么我们避免ArrayListIterator中的错误检测的原因)。在第30行上的具体的remove模仿ArrayListIterator中的逻辑。不过在这里current是保持不变的, 因为current正在观察的节点不受前面节点被删除的影响(在ArrayListIterator中, 项被移动, 要求更新current)。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

PHP程序开发范例宝典

本书全面介绍了应用PHP进行网站开发的各种技术和技巧。全书分为20章,内容包括PHP的运行环境配置、表单及表单元素的应用、CSS与JavaScript...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊