#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 на следующий узел, мы больше не ссылаемся на то же самое. Я ценю схему!