我正在通过有关 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
}
注意:我故意不封装变量,并删除了多余的代码以节省空间。我知道它不能编译,但我的问题更具概念性。
在 add 方法中:
if 语句只是检测迭代器的位置是否为空,在这种情况下,它将元素添加到 LinkedList 的开头,并将迭代器的位置设置为这个新创建的节点。
else 语句让我感到困惑:
第 1 行和第 2 行:创建了一个新节点,并将其数据设置为元素参数。
第 3 行,这个新节点的下一个变量被设置为当前节点的下一个节点,即它被设置为迭代器所指向的节点位置之后的任何值。第 4 行,将 Iterator当前指向
的节点的“下一个”更改为 newNode(有效地完成了新节点在两个现有节点之间的插入)。
第 5 行,将 Iterator 的位置设置为指向 newNode。
在 else 语句之后,将迭代器指向的前一个节点设置为当前节点。
这就是问题所在 - 这样做有效地同步了迭代器的位置和先前的位置。我通过 Eclipse 调试器检查了这一点。这使得以前的无用。但是,我知道无论如何您都无法使用标准迭代器反向遍历 LinkedList。
当我评论这条线时,似乎没有任何改变。这条线是完全没有必要的,还是有一些我实际上没有意识到的功能?(我要问的另一个原因是,我们的 remove() 方法的注释中出现了与此相反的情况,这似乎也没有任何目的。
编辑:随着我的课程的发展,这个答案似乎可以得到回答。现在,我将 previous = current 行移到 current = newNode 行的上方。这似乎将所有值分开。