我的递归列表的前置函数创建了一个无限列表

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