|
|
|
|
移动端

3.5 LinkedList类的实现(1)

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

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

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


3.5 LinkedList类的实现(1)

本节给出可以使用的LinkedList泛型类的实现。和在ArrayList类中的情形一样, 我们这里的链表类将叫作MyLinkedList以避免与库中的类相混。

前面提到, LinkedList将作为双链表来实现, 而且我们还需要保留到该表两端的引用。这样做可以保持每个操作花费常数时间的代价, 只要操作发生在已知的位置。这个已知的位置可以是端点, 也可以是由迭代器指定的一个位置(不过, 我们不实现ListIterator, 因此有些代码留给读者去完成)。

在考虑设计方面, 我们将需要提供三个类:

1. MyLinkedList类本身, 它包含到两端的链、 表的大小以及一些方法。

2. Node类, 它可能是一个私有的嵌套类。一个节点包含数据以及到前一个节点的链和到下一个节点的链, 还有一些适当的构造方法。

3. LinkedListIterator类, 该类抽象了位置的概念, 是一个私有类, 并实现接口Iterator。它提供了方法next、 hasNext和remove的实现。

由于这些迭代器类存储“当前节点”的引用, 并且终端标记是一个合理的位置, 因此它对于在表的终端创建一个额外的节点来表示终端标记是有意义的。更进一步, 我们还能够在表的前端创建一个额外的节点, 逻辑上代表开始的标记。这些额外的节点有时候就叫作标记节点(sentinel node); 特别地, 在前端的节点有时候也叫作头节点(header node), 而在末端的节点有时候也叫作尾节点(tail node)。

使用这些额外节点的优点在于, 通过排除许多特殊情形极大地简化了编码。例如, 如果我们不是用头节点, 那么删除第1个节点就变成了一种特殊的情况, 因为在删除期间我们必须重新调整链表的到第1个节点的链, 还因为删除算法一般还要访问被删除节点前面的那个节点(而若无头节点, 则第1个节点前面没有节点)。图3-22显示一个带有头节点和尾节点的双链表。图3-23显示一个空链表。图3-24则显示MyLinkedList类的概要和部分的实现。

我们在第3行可以看到私有嵌套Node类声明的开头部分。图3-25显示这个由所存储的一项组成的Node类——它的连接到前一个Node的链和下一个Node的链, 还有一个构造方法。所有的数据成员都是公用的。我们知道, 在一个类中, 数据成员通常是私有的。然而, 在一个嵌套类中的成员甚至在外部类中也是可见的。由于Node类是私有的, 因此在Node类中的那些数据成员的可见性是无关紧要的; 那些MyLinkedList的方法能够见到所有的Node数据成员, 而MyLinkedList外面的那些类则根本见不到Node类。

现在回到图3-24, 第44行到第47行包含MyLinkedList的数据成员, 即到头节点和到尾节点的引用。我们也掌握一个数据成员的大小, 从而size方法可以以常数时间实现。在第45行有一个附加的数据域, 用来帮助迭代器检测集合中的变化。modCount代表自从构造以来对链表所做改变的次数。每次对add或remove的调用都将更新modCount。其想法在于, 当一个迭代器被建立时, 他将存储集合的modCount。每次对一个迭代器方法(next或remove)的调用都将用该链表内的当前modCount检测在迭代器内存储的modCount, 并且当这两个计数不匹配时抛出一个ConcurrentModificationException异常。

MyLinkedList类的其余部分由构造方法、 迭代器的实现以及一些方法组成。许多方法都只是一行代码。

图3-26中的clear方法由构造方法调用。它创建并连接头节点和尾节点, 然后设置大小为0。

在图3-24的第41行可以看到私有内部LinkedListIterator类的声明的开头部分。当我们在后面看到其具体实现时将讨论这些细节。

图3-27解释一个包含x的新节点是如何被拼接在由p引用的一个节点和p.prev之间的。这些节点链的赋值可以描述如下:

第3步和第4步可以合并, 结果只有两行:

可是这两行还可以合并, 得到:

这就缩短了图3-28中的例程addBefore。


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

51CTO读书频道二维码


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

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

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

读 书 +更多

网管员必读—超级网管经验谈(第2版)

本书的第1版获得过“2006年度全行业优秀畅销品种奖”。全书共15章,分别介绍了网管员职责和应具备的工作习惯、共享上网与访问控制方法、子...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊