какую роль каждый узел играет в связанном списке? - PullRequest
0 голосов
/ 07 октября 2018

Почему каждый раз, когда мы создаем новый узел p.next, нам нужно присвоить null this.next?не всегда ноль в любом случае?и какую роль он играет в LinkedList?если мы попытаемся распечатать this.next, это будет null , прежде чем мы присвоим его null .

System.out.println(this.next);

Результат равен null

Также, если p.next указывает на новый node, почему нам нужно установить p = p.next, чтобы он указывал на тот же узел?если цель установить tail в p наконец, мы не можем просто установить tail = p.next, который является последним после завершения цикла for.

public class EnkeltLenketListe<T>{
private T value;
private Node<T> next;

private Node(T value, Node<T> next)
{
System.out.println(this.next);
    this.next = next;
    this.value = value;
}
}

private Node<T> head, tail;

public EnkeltLenketListe(T[] a)
{
this();

int i = 0; for (; i < a.length && a[i] == null; i++);

if (i < a.length)
{
    head = new Node<>(a[i], null);
    Node<T> p = head;

    for (i++; i < a.length; i++)
    {
        if (a[i] != null)
        {
            p.next = new Node<>(a[i], null);
            p = p.next;
        }
    }
    tail = p;
}
}

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Почему каждый раз, когда мы создаем новый узел p.next, нам нужно присвоить null this.next?

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

почему нам нужно установить p = p.next так, чтобы он указывал на тот же узел

, чтобы найти и сохранить свою позицию в списке, пока вы пересекаете список,Вы начинаете с головы и продолжаете к остальным узлам.если p=p.next, как вы собираетесь обходить список?

мы не можем просто установить tail = p.next, который является последним после завершения цикла for.

Нет, мы не можем, потому что в этом случае p.next эквивалентно p.p.next, потому что p было установлено на p.next внутри цикла.протестируйте его, добавив следующее перед tail=p, вы должны получить null

System.out.println(p.next);


Отредактировано:

ваш список является односвязным списком, что означает каждыйузел, кроме хвоста, должен иметь указатель на следующий узел, вы начали с

head = new Node<>(a[i], null);
Node<T> p = head;

, в этом случае p и head указывают Node 0, см. изображение ниже.если следующий узел в массиве не равен нулю, давайте посмотрим, что происходит в цикле for

    p.next = new Node<>(a[i], null);
    p = p.next;

В этом случае p.next указывает на Node 1 (см. изображение ниже), где как p которые указывали на Node 0 теперь настроены на Node 1.так что оба указывают на «Узел 1».последний:

tail = p;

Вы сказали, что почему бы нам не просто tail=p.next?Нет, мы не можем, потому что в этом случае p.next эквивалентно p.p.next, потому что p было установлено на p.next внутри цикла.

singly linked list

читать о односвязном списке здесь

0 голосов
/ 07 октября 2018

Попробуйте использовать противоречие.Если вы не установили p = p.next, на следующей итерации цикла снова вы установите новый узел на следующую позицию предыдущего узла.Следовательно, все время p является head, и вы больше не перемещаете p!

Следовательно, вам нужно перемещать p в каждой итерации после установки p.next.Действительно, это указатель на последний элемент списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...