Почему манипулирование псевдонимом узла LinkedList позволяет этому методу работать? - PullRequest
0 голосов
/ 30 сентября 2019

Я не понимаю, почему метод ниже работает. Как следует из названия, он удаляет все нулевые значения в связанном списке, а передняя часть списка называется head. Я понимаю, что псевдоним переменной head создается с Node<E> current = head, но я не могу понять, как этому методу удается сохранить исходную переменную head. Судя по всему, с каждой итерацией ток становится все меньше и меньше (current = current.next или current.next = current.next.next), но каким-то образом полностью неповрежденная и точная переменная head остается при распечатке связанного списка. Я уверен, что этот ответ должен быть очень простым, но он ускользает от меня.

public void remove_nulls() {
    while (head!=null && head.data==null) {
        removeFirst();
    }
    if (head==null) {
        return;
    }
    // List is non-empty and does not start with a null item
    Node<E> current=head;
    while (current.next!=null) {
        if (current.next.data==null) {
            current.next=current.next.next;
            size--;
        } else {
            current = current.next;

        }
    }
}

1 Ответ

1 голос
/ 01 октября 2019

Я понимаю, что псевдоним переменной head создается с Node<E> current = head

Это утверждение неверно, поскольку current не является псевдонимом, это новая ссылкакоторый указывает на тот же адрес, что и head. Поэтому, когда вы переназначаете current = current.next, ссылка head не изменяется, она все равно будет указывать на адрес, на который она указала, а current будет указывать на следующий элемент.

Другими словами,если первый элемент списка не является null, ссылка head не будет изменена и будет по-прежнему указывать на тот же элемент после завершения метода. Все остальные элементы null удаляются этой строкой: current.next = current.next.next;:

enter image description here

...