我的递归列表的前置功能创建了一个无尽的列表

时间:2019-04-22 11:48:01

标签: java list generics recursion generic-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,........}

3 个答案:

答案 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;
    }
}