java - 对 LinkedList 中 ListIterator 的 add() 方法感到困惑

标签 java linked-list

我正在大学进行 LinkedLists 实践。 我很难理解遍历 LinkedList 的迭代器的 add() 方法。我们的讲师已经为我们提供了实现此功能的代码,因此完全从他那里复制:

public class LinkedList
{
    public LinkedList() {
        Node first = null;
    }

    class Node {
        public Object data;
        public Node next;
    }  

    class LinkedListIterator implements ListIterator {

        public LinkedListIterator() {
            Node position = null;
            Node previous = null;
        }

        public void add (Object element) {
            if (position == null) {
                addFirst(element);
                current = first;
            } else {
                //1 Node newNode = new Node();
                //2 newNode.data = element;
                //3 newNode.next = current.next;
                //4 current.next = newNode;
                //5 current = newNode;
            }
            previous = current
        }

注意:我故意不封装变量,并删除了多余的代码以节省空间。我知道它无法编译,但我的问题更具概念性。

在添加方法中:
if 语句只是检测迭代器的位置是否为 null,在这种情况下,它将元素添加到 LinkedList 的开头,并将迭代器位置设置为这个新创建的节点。

else 语句让我感到困惑:
第 1 行和第 2 行:创建一个新节点,并将其数据设置为元素参数。
第 3 行,这个新节点的 next 变量被设置为当前节点的 next 节点,即它被设置为迭代器指向的节点位置之后的任何内容.
第 4 行,迭代器当前指向的节点的“下一个”更改为 newNode(有效地完成在两个现有节点之间插入新节点)。
第 5 行,将迭代器的位置设置为指向 newNode。

在 else 语句之后,迭代器指向的前一个节点被设置为当前节点。

问题就在这里 - 这样做可以有效地同步迭代器的位置和前一个位置。我通过 Eclipse 调试器检查了这一点。这使得之前的内容变得毫无用处。但是,我知道您无论如何都无法使用标准迭代器反向遍历 LinkedList。

当我注释掉这一行时,似乎没有任何变化。这条线是根本没有必要的还是它有一些我实际上没有意识到的功能? (我问的另一个原因是因为与此相反的情况出现在我们的 remove() 方法的注释中,该方法似乎也没有目的。

编辑:看来这个答案可能会随着我的类(class)的发展而得到解答。现在,我将 previous = current 行移至 current = newNode 行上方。这似乎将所有值分开。

最佳答案

合约ListIterator.add(Object)指定next 的后续调用不受影响,而对 previous 的后续调用将返回新元素,这就是更新的目的previous 中的 add 的实现。

关于java - 对 LinkedList 中 ListIterator 的 add() 方法感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15118694/

相关文章:

java - 在 Apache Camel 中修改主体的最佳方法?

algorithm - 如何从双向链表中找到第 k 个最小元素?

java - Java中删除双向链表中的节点

java - Tomcat 服务器上的 SSL 证书

java - 使用 xmlbeans 时使用反射创建实例

java - Android解析json响应中的特殊字符

c - 从字符串链接列表中删除字符串

java - 如何有效地从java LinkedList中删除一个元素

java - 合并社区并找到最大社区的规模

java - 是否建议使用 Server Sent Events 通过持续查询数据库来推送通知?