【发布时间】:2021-08-17 13:12:27
【问题描述】:
我正在尝试在 Java 中创建一个 while 循环,用于计算双向链表中的节点数。然而,我的 while 循环产生了额外的价值,我似乎无法弄清楚为什么。有人可以帮我吗?
下面的方法用于统计我在 Main Method 中定义的列表中的节点数。我在 main 方法中调用了 getListSize() 方法。
public static <E> int Size(Linked<E> L) {
int counter=0;
while (L.header != null && L.header != L.trailer)
{
L.header= L.header.getNext();
counter++;
}
return counter;
}
public static void main(String[] args)
{
Linked<String> list = new Linked<String>();
list.addFirst("1");
list.addFirst("4");
list.addLast("3");
list.addLast("2");
System.out.println(Size(list));
}
但我得到的输出是 5 而不是 4
节点和链接类
公共类链接{
public static class Node<E> {
private E element;
private Node<E> prev;
private Node<E> next;
public Node(E e, Node<E> p, Node<E> n) {
element = e;
prev = p;
next = n;
}
public E getElement() { return element; }
public Node<E> getPrev() { return prev; }
public Node<E> getNext() { return next; }
public void setPrev(Node<E> p) { prev = p; }
public void setNext(Node<E> n) { next = n; }
}
public Node<E> header;
public Node<E> trailer;
private int size = 0;
public Linked() {
header = new Node<>(null, null, null);
trailer = new Node<>(null, header, null);
header.setNext(trailer);
}
}
【问题讨论】:
-
这似乎是双向链表的自定义实现。你确定你的实现没有错误吗?或许您应该显示该代码。
-
L.header != L.trailer有什么用?好像你不会计算最后一个节点,但你说输出是 5 而不是 4。 -
顺便说一句,您不应该像那样更改 L.header 。您正在覆盖您的头指针,该列表将毫无用处。相反,在函数的开头创建一个变量 pointer = l.header 并设置它的值。
-
@MostNeededRabbit L.header != L.trailer 检查列表的头部和尾部是否相同,这意味着列表中只有一个元素。如果我删除它,那么我会得到 6
-
@GabeSechan 谢谢,我会做出这些改变
标签: java while-loop linked-list counter