当前,我正在研究Java中的通用列表。问题:prepend方法无法正常工作。而不是在索引0处添加元素T,而是创建了一个无限的递归列表。
public class Vector<T>{
private T value;
private Vector<T> next = null;
public Vector(T value){
this.value = value;
}
public Vector(T value, Vector<T> next){
this.value = value;
this.next = next;
}
public void prepend(T element){
this.next = this;
this.value = element;
}
}
public class Main{
...
Vector<Integer> v1 = new Vector<Integer>(new Integer(1));
v1.prepend(new Integer(0));
...
预期输出:{0,1} 实际输出:{0,0,0,0,0,0,0,........}
答案 0 :(得分:0)
this.next = this
创建单个元素的循环列表。
您正在尝试使用相同的类来实现列表和列表的节点。您应该使用一个类来表示列表(并保留对列表头的引用),并使用另一个类来表示列表的节点。
您的prepend方法应该创建一个新的链接实例。然后,该新实例应该成为列表的新头,而下一个实例应该是列表的原始头。
public class Vector<T>{
public static class Node<T> {
private T value;
private Node<T> next = null;
...
}
private Node<T> head;
...
}
答案 1 :(得分:0)
已更新:
您的前置方法错误。如果您不想保存列表的开头,则您的方法应该像这样。
public void prepend(T element){
Vector<T> val = new Vector<T>(element);
val.next = this.next;
this.next = val; // after this statement new Element at inserted at 1 position.
// Swap the values
val.value = this.value;
this.value = element;
}
然后主要创建一个向量
Vector<Integer> v1 = new Vector<Integer>(new Integer(1));
v1.prepend(new Integer(0));
答案 2 :(得分:0)
您正在做什么:首先,创建一个Vector,其值= 1,next = null。 “ Prepending” 0,在此旁边设置,进行无穷递归,然后将value设置为0。如果查看Vector,则首先获得value =0。然后转到下一个Vector,仍然是。在该“新”向量中,您输出的值=0。然后,切换到下一个向量,仍然是这个。在那个“新”向量中,您输出的值=0。然后...得到它。
您最可能想做的是:在添加整数之前,要将其复制到下一个并将值设置为新的整数。内容如下:
public class Vector<T>{
[…]
public void prepend(T element){
this.next = new Vector<>(value, next); // a Copy Constructor would also be fine
this.value = element;
}
}