【问题标题】:Confused regarding add() method of a ListIterator in a LinkedList对 LinkedList 中 ListIterator 的 add() 方法感到困惑
【发布时间】:2013-02-27 17:43:10
【问题描述】:

我正在通过关于 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 语句只是检测迭代器的位置是否为空,在这种情况下,它将元素添加到 LinkedList 的开头,并将迭代器的位置设置为这个新创建的节点。

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

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

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

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

编辑:随着我的课程的发展,这个答案似乎可以得到回答。现在,我将 previous = current 行移到 current = newNode 行的上方。这似乎将所有值分开。

【问题讨论】:

  • @Aubin 实际上是一个ListIterator,它扩展了常规的Iterator 接口,包括addsethasPreviousprevious 方法。
  • 啊,道歉 - 应该更具体。

标签: java linked-list


【解决方案1】:

ListIterator.add(Object) 的合约规定随后对next 的调用将不受影响,随后对previous 的调用将返回新元素,这就是更新@ 的目的987654325@在执行add

【讨论】:

  • 但是这样做会同步以前的和当前的,这意味着对于程序运行的其余部分,它们被设置为相同的东西。我认为正如其他人在这里所说的那样,它可能会在以后的讲座中得到扩展。
【解决方案2】:

您的教授可能会为您提供示例代码,稍后将对其进行扩展。看起来示例代码包含将来支持双向链表的部分。双链表确实允许列表的反向遍历。 See wikipedia for details.

关于一个完全不相关的话题;我为你实际上试图理解和理解给你的东西而鼓掌,而不是只是即插即用地完成任务。这个习惯对你将来有好处!

【讨论】:

  • 谢谢,以后可能会扩展。谢谢你的客气话!我们实际上根本不需要接触或修改 add 方法,我只想知道一切是如何工作的,以及何时最好使用 arraylists、linkedlists 等。
【解决方案3】:

这对我来说似乎是一个错误。 previous = current 分配需要current = newNode 分配之前发生。那么previous 将引用旧的current,而新的current 将是新创建的节点。

【讨论】:

  • 我就是这么想的。我想我们稍后会扩展它。谢谢你
猜你喜欢
  • 2013-07-27
  • 2017-03-20
  • 2013-07-19
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多