我正试图在Java中创建一个while循环,用于计算双链表中的节点数。然而,我的while Loop正在产生额外的价值,我似乎不明白为什么。有人能帮帮我吗?
下面的方法用于计算我在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);
}
}
我们不应该在意头和尾是否相同,因为节点将具有next = null
。
代码:
public static int size(Linked<Node> L) {
int counter = 0;
Node curr = L.header;
while (curr != null) {
counter++;
curr = curr.next;
}
return counter;
}
示例:
Node a = new Node("A");
Linked<Node> linked = new Linked<>(a, a);
System.out.println(size(linked)); // 1
--------------------------------------
Node a = new Node("A");
Node b = new Node("B");
a.next = b;
Linked<Node> linked = new Linked<>(a, b);
System.out.println(size(linked)); // 2
--------------------------------------
Node a = new Node("A");
Node b = new Node("B");
Node c = new Node("C");
a.next = b;
b.next = c;
Linked<Node> linked = new Linked<>(a, c);
System.out.println(size(linked)); // 3
至少部分问题是因为您添加了两个"空";节点添加到列表中,然后对它们进行计数。这是一种奇怪的做事方式。
你还没有向我们展示你的add()
方法,所以可能潜伏着更多的错误。
public Linked() {
header = new Node<>(null, null, null); // <- Extra
trailer = new Node<>(null, header, null); // <- Extra
header.setNext(trailer);
}
这很奇怪,我想你的教练可能已经给了你如何处理这些额外节点的特别指示。你可能想咨询你的老师,可能有一节课你错过了。
顺便说一句,这两个节点不会作为==
进行比较,所以您不能使用它来结束迭代。我还注意到你的名单是循环的。尾部指向收割台,收割台设置为指向拖车。这也很奇怪,我再次认为你应该向你的导师寻求澄清,你写的代码似乎没有考虑到这一点。
此外,正如Gabe所指出的,在计数过程中,您似乎覆盖了header
的值。这会把一切搞砸的。
public static <E> int Size(Linked<E> L) {
int counter=0;
Node<E> current = L.header;
while (current != null && L.header != L.trailer)
{
current = L.header.getNext();
counter++;
}
return counter;
}
最后,上面的代码仍然是错误的。我想你的导师写过";怪异的";专门用于防止您直接从互联网上复制代码的代码。这里需要进行一些补充思考。我已经给了你一个提示(关于L.header
被覆盖(,但我认为你应该和你的教练谈谈其余的