Функция Prepend моего рекурсивного списка создает бесконечный список - PullRequest
0 голосов
/ 22 апреля 2019

В настоящее время я работаю над общим списком на Java.Проблема: метод prepend работает не так, как должен.Вместо добавления элемента T с индексом 0 создается бесконечный рекурсивный список.

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 голосов
/ 22 апреля 2019

Обновлено:

Ваш метод 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;
}

И в основном создайте вектор

Vector<Integer> v1 = new Vector<Integer>(new Integer(1));
v1.prepend(new Integer(0));
0 голосов
/ 22 апреля 2019

Что вы делаете: сначала вы создаете вектор со значением = 1, затем = ноль. «Preeding» 0, вы устанавливаете рядом с этим бесконечную рекурсию, затем вы устанавливаете значение = 0. Если вы посмотрите на свой Вектор, вы сначала получите значение = 0. Затем вы переключитесь на Вектор следующий, который по-прежнему таков. Из этого «нового» вектора вы выводите значение = 0. Затем вы переходите к следующему вектору Vector, который по-прежнему является этим. Из этого «нового» вектора вы выводите значение = 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;
    }
}
0 голосов
/ 22 апреля 2019

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