От Cracking Coding Interview. Проблема 2.1: Введите код для удаления дубликатов из несортированного связанного списка. Это решение, которое они обеспечивают:
public static void removeDuplicates(Node n) {
Hashtable<Integer, Boolean> table = new Hashtable<Integer, Boolean>();
Node previous = n;
while (n != null) {
if (table.containsKey(n.data)) {
previous.next = n.next;
} else {
table.put(n.data, true);
previous = n;
}
n = n.next;
}
}
Мой вопрос: когда вы делаете n = n.next, не потеряете ли вы голову списка (первый узел)? Как бы вы снова получили доступ к этому списку с удалением дубликатов, если у вас нет доступа к голове?
А также разве лучше использовать набор вместо таблицы? Я не думаю, что вам нужен ключ и ценность. Думаю, вам нужен только ключ, верно?
спасибо
Во-первых, как уже упоминалось в комментарии, изменение локального параметра не влияет на входную переменную вызывающих.
Во-вторых, вы правы, использование Set будет лучше, но только потому, что код лучше читать. Код синтаксически корректен, внутренне набор - это не что иное, как карта с тем же самым dummyobject, что и значение для каждого ключа.
n
является локальным для функции. Изменения в нем не влияют на исходную переменную в вызывающей функции.