Ссылки на узлы в связанном списке Java

#java #data-structures #linked-list

#java #структуры данных #связанный список

Вопрос:

Мне нужна некоторая помощь в понимании того, как работает тот или иной метод.

У меня есть базовый Node класс, определенный следующим образом:

 class Node {
    Node next = null;
    int data;
    public Node(int d){
        data = d;
    }
}
  

Теперь я смотрю на то, как работает этот deleteDuplicates метод. Я понимаю, что мы проходим через каждый узел итеративно и сохраняем его значение в наборе. Если значение уже есть в наборе, я полагаю, что мы устанавливаем next указатель предыдущего узла, чтобы пропустить текущий узел. Вот этот метод:

 public static Node deleteDuplicates(Node head){
    Node n = head;
    HashSet<Integer> set = new HashSet<Integer>();
    Node previous = null;
    while(n != null) {
        if (set.contains(n.data)){
            // skip this node
            previous.next = n.next;
        }
        else {
            set.add(n.data);
            previous = n;
        }
        n = n.next;

    }
    return head;
}
  

Я запутался в переменных previous и n . Когда мы устанавливаем previous = n; , разве это не заставляет их ссылаться на один и тот же объект? Если они ссылаются на один и тот же объект, одно изменение, которое вы внесете в n , будет таким же в previous . Итак, как работает эта линия previous.next = n.next; ?

Спасибо!

Комментарии:

1. Не должно previous.next = n.next; быть previous = n.next; ?

2. @c0der кажется, что все в порядке, но это все равно не объясняет ссылочный вопрос

3. Я спрашиваю об этом, потому что кажется, что этот метод неверен. Использование ‘previous.next’, когда previous есть null , является одним из примеров,

4. @c0der предыдущий присваивается до того, как он перейдет к этому оператору if

5. Извините за мою ошибку.

Ответ №1:

прочитайте эти две строки вместе,

 previous = n;  
n = n.next;
  

Итак, как только узел обработан, указатели на предыдущий и n перемещаются вперед. n является следующим узлом после предыдущего, поэтому предыдущему присваивается значение n, а n перемещается на следующий узел, который равен n.next

Что касается части удаления, надеюсь, приведенная ниже диаграмма поможет

введите описание изображения здесь

Комментарии:

1. Спасибо, я думаю, это проясняет ситуацию для меня. Я просматривал весь связанный список как единый объект, когда на самом деле это серия объектов (которые являются узлами). Поэтому, когда мы меняем n на следующий узел, мы больше не ссылаемся на то же самое. Я ценю схему!