我的递归列表的前置函数创建了一个无限列表
Prepend function of my recursive list creates an endless list
目前,我正在 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, ....... }
this.next = this
创建单个元素的循环列表。
您正在尝试使用相同的 class 实现列表和列表的节点。您应该使用一个 class 来表示列表(并保存对列表头部的引用),另一个 class 来表示列表的一个节点。
您的前置方法应该创建一个新的 link 实例。然后那个新实例应该成为列表的新头,它的下一个应该是列表的原始头。
public class Vector<T>{
public static class Node<T> {
private T value;
private Node<T> next = null;
...
}
private Node<T> head;
...
}
更新:
你的prepend方法是错误的。如果你不想保存列表的头部,你的方法应该是这样的。
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;
}
并在 main 中创建一个向量
Vector<Integer> v1 = new Vector<Integer>(new Integer(1));
v1.prepend(new Integer(0));
您在做什么:首先,您创建一个 Vector,其值 = 1,next = null。 „Prepending“ 0,你在这个旁边设置,一个无限递归,然后你设置值= 0。如果你看你的Vector,你首先得到值= 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;
}
}
目前,我正在 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, ....... }
this.next = this
创建单个元素的循环列表。
您正在尝试使用相同的 class 实现列表和列表的节点。您应该使用一个 class 来表示列表(并保存对列表头部的引用),另一个 class 来表示列表的一个节点。
您的前置方法应该创建一个新的 link 实例。然后那个新实例应该成为列表的新头,它的下一个应该是列表的原始头。
public class Vector<T>{
public static class Node<T> {
private T value;
private Node<T> next = null;
...
}
private Node<T> head;
...
}
更新:
你的prepend方法是错误的。如果你不想保存列表的头部,你的方法应该是这样的。
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;
}
并在 main 中创建一个向量
Vector<Integer> v1 = new Vector<Integer>(new Integer(1));
v1.prepend(new Integer(0));
您在做什么:首先,您创建一个 Vector,其值 = 1,next = null。 „Prepending“ 0,你在这个旁边设置,一个无限递归,然后你设置值= 0。如果你看你的Vector,你首先得到值= 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;
}
}