我正在编写用于测试某些代码的main方法,但是我的main模式存在一些无法正确测试代码的错误。有人可以帮我解决主要方法中的问题吗?
这是测试课程的一些背景:
将LLNode类输入DrJava:
/**
* The node of a linked list
*/
public class LLNode<T> {
/** the element stored in the node */
private T element;
/** a reference to the next node of the list */
private LLNode<T> next;
/**
* the constructor
* @param element the element to store in the node
* @param next a reference to the next node of the list
*/
public LLNode(T element, LLNode<T> next) {
this.element = element;
this.next = next;
}
/**
* Returns the element stored in the node
* @return the element stored in the node
*/
public T getElement() {
return element;
}
/**
* Returns the next node of the list
* @return the next node of the list
*/
public LLNode<T> getNext() {
return next;
}
/**
* Changes the node that comes after this node in the list
* @param next the node that should come after this node in the
list. It can be null.
*/
public void setNext(LLNode<T> next) {
this.next = next;
}
}
其余代码可在“交互”窗格中输入。如果出现错误,请输入更正的代码。如果您真的很困惑,可以重置“交互”窗格,然后重试。
第1步:编写Java命令以创建以下链接列表,其中变量listHead指向列表的第一个节点:
+---+---+ +---+---+ +---+---+
listHead ---> | 1 | *-+----> | 2 | *-+----> | 3 | *-+--X
+---+---+ +---+---+ +---+---+
提示:您可以使用“交互”窗格中的3行代码来完成此操作。 (有趣的是,尝试只用一行执行!)您可以通过键入listHead.getElement(),listHead.getNext()。getElement(),listHead.getNext()。getNext()。getElement()和在“交互”窗格中,单击listHead.getNext()。getNext()。getNext(),如果您的列表正确,则输出应为1、2、3和null。
在上图中,每个框都引用一个LLNode对象,框中的左侧项目是元素,右侧项目是下一个引用。
第2步:尝试创建相同的链表,但是现在使用循环,在该循环中,每次迭代都将创建一个LLNode实例。要创建三个节点,循环将需要迭代3次。 (提示:向前或向后创建列表更容易吗?)
import java.util.*;
public class prelab10 {
public static void main(String args[]){
LLNode start = null;
LLNode end = null;
int i = 0;
int size = 3;
Scanner scan = new Scanner(System.in);
LLNode list = new LLNode(1,null);
LLNode list1 = new LLNode(2,null);
LLNode list2 = new LLNode(3,null);
start = list;
end = start;
list.setNext(start);
start = list;
list1.setNext(start);
start = list1;
list2.setNext(start);
start = list2;
LLNode a =start ;
while(i!= size)
{
i++;
System.out.println(a.getElement()+"<->");
a = a.getNext();
}
while(i == 3)
System.out.println("null");
}
}
我希望输出从开始到结束都是1,2,3,null而不是null
答案 0 :(得分:0)
我建议您逐行检查一下您要建造的结构。
实际上,您已经很接近了,您建立的结构是:
list3 -> list2 -> list1 -> list1
请注意,list1
指向自身,因此,如果删除行list1.setNext(start)
,您应该得到:
list3 -> list2 -> list1 -> null
在这里您可以看到:
public class prelab10 {
public static void main(String args[]){
LLNode<Integer> start = null;
LLNode<Integer> end = null;
LLNode<Integer> list1 = new LLNode<Integer>(1, null);
LLNode<Integer> list2 = new LLNode<Integer>(2, null);
LLNode<Integer> list3 = new LLNode<Integer>(3, null);
start = list1;
end = start;
// start -> list1
// end -> list1
// This one is wrong, list1 should NOT point to itself:
// list1.setNext(start);
start = list1;
// list1.next -> start -> list1
// start -> list1
list2.setNext(start);
start = list2;
// list2.next -> start -> list1
// start -> list2
list3.setNext(start);
start = list3;
// list3.next -> start -> list2
// start -> list3
LLNode cursor = start;
// cursor -> start -> list3
// So, what you have build is:
// list3 -> list2 -> list1 -> list1
// Removing list1.setNext(start), you would have:
// list3 -> list2 -> list1 -> null
// This loop will never end in your original code, as cursor will never be
// null, as list1's next pointer points to itself:
while (cursor != null) {
System.out.print(cursor.getElement() + " -> ");
cursor = cursor.getNext();
}
}
}
这应该可以帮助您调试和修复代码。
您可能还想以相反的顺序链接/链接节点。