Замените результат на Optional<T> и реально обходите связанные узлы, а не только увеличивайте счётчик. Отрицательный индекс удобно считать ошибкой аргумента, выход за конец — Optional.empty().
Безопасный доступ к элементу списка по индексу
Замените результат на Optional<T> и реально обходите связанные узлы, а не только увеличивайте счётчик. Отрицательный индекс удобно считать ошибкой аргумента, выход за конец — Optional.empty().
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо избавиться от возврата null в случае, когда запрашиваемый элемент отсутствует, заменив его более надёжным и типобезопасным механизмом, а также улучшить контракт интерфейса для корректной обработки подобных сценариев.
package com.narozhnyi;
public interface Node<T> {
// добавление элемента
boolean add(T val);
// извлечение элемента по индексу
T get(int index);
}
@Override
public T get(int index) {
// считать счётчик = 0
// бежать по списку до тех пор пока у нас next не будет null
int pos = 0;
for (int step = 0; step < index; step++) {
if (pos == index) {
return value;
}
pos++;
}
return null;
}
Ответ
Замените результат на Optional<T> и реально обходите связанные узлы, а не только увеличивайте счётчик. Отрицательный индекс удобно считать ошибкой аргумента, выход за конец — Optional.empty().
Новый контракт: Optional<T> get(int index). Алгоритм: установить current=head; index раз перейти к current.next, останавливаясь при null; вернуть empty для отсутствующего узла, иначе Optional.of(current.value). Для этого add должен запрещать null, чтобы существующий пустой элемент не смешивался с отсутствием. В исходном цикле ссылки вообще не меняются, а проверка pos == index стоит до достижения index. Если требуется поведение стандартного List, альтернативой является IndexOutOfBoundsException вместо Optional.