Реализован конструктор связанного списка для заполнения значений до определенного размера - PullRequest
0 голосов
/ 11 марта 2020

У меня есть класс связанного списка и класс узла, и я хочу написать конструктор, который будет заполнять связанный список тем же узлом до размера 'n'. Тем не менее, я не могу сформулировать лог c правильно. Вот где я нахожусь:

У меня есть поле 'head' для представления заголовка связанного списка.

В классе 'node' есть поле для представления следующего значения ( : node.next).

    public LinkedList(int size, Object value)
    {
        int index = 0;
        head = value; //setting first node to value
        Object workingReference = head; //creating a working reference to iterate through the list
        for(index = 0; index < size - 1; index++)
        {
            workingReference.next = value; //setting the next node to the given value
            workingReference = workingReference.next; //setting the "index" to the next "index"
        }
    }

Проблема состоит в том, что никогда не бывает «нулевого» значения, когда l oop достигает ограничений, поэтому следующий узел всегда является заданным «значением», сделать список «бесконечным». Я играл с установкой value.next на ноль, но это устанавливает head.next на ноль по какой-то причине. Я чувствую, что решение прямо передо мной, но я не думаю об этом правильно. Спасибо за ваше время.

1 Ответ

0 голосов
/ 11 марта 2020

Для начала измените тип value и workingReference на Node вместо Object, чтобы помочь всем понять.

Ваша главная проблема в том, что вы не копируете value когда вы его назначаете. Вероятно, вам нужно значение переменной value, поэтому здесь очень полезно назвать ее Node вместо Object.

public LinkedList(int size, Node value)
{
    int index = 0;
    head = value; 
    Node workingReference = head;
    for(index = 0; index < size - 1; index++)
    {
        // Here, workingReference, head and value are all the same thing
        // So when you set workingReference.next = value,
        // You've created a loop (value.next points to value)
        workingReference.next = value; 
        workingReference = workingReference.next;         
    }
}

То, что вы хотите сделать, - это создать новую узел каждый раз, с содержимым узла value. Давайте переименуем value в initialNode, чтобы было понятнее, как работает исправление:

public LinkedList(int size, Node initialNode)
{
    int index = 0;
    head = initialNode; 
    Node workingReference = head;
    for(index = 0; index < size - 1; index++)
    {
        Node newNode = new Node(initialNode.value);
        workingReference.next = newNode; 
        workingReference = workingReference.next;         
    }
}

Теперь, вместо создания al oop, каждый узел является новым. head указывает на initialNode, а next (и все next s для size итераций) все указывают на поле value этого initialNode.

Если вы чтобы значение Object было передано методу, сделайте это следующим образом:

public LinkedList(int size, Object initialValue)
{
    int index = 0;
    head = new Node(initialValue); 
    Node workingReference = head;
    for(index = 0; index < size - 1; index++)
    {
        Node newNode = new Node(initialValue);
        workingReference.next = newNode; 
        workingReference = workingReference.next;         
    }
}
...