Как удалить последний элемент в стеке, на основе односвязного списка?

Метод должен возвращать значение и удалять его из коллекции

public T deleteLast() throws NoSuchElementException {
if (head == null) {
throw new NoSuchElementException("Список пуст");
}

Node ref = head;
for (int i = 0; i < size; i++) {
ref = ref.next;
}
size--;
T temp = ref.value;
ref.next = null;
return temp;
}

Есть тест:

@Test
public void whenPushPollThenPushPoll() {
SimpleStack stack = new SimpleStack<>();
stack.push(1);
stack.pop();
stack.push(2);
assertThat(stack.pop(), is(2));
}

Тест не работает так как не правильно реализован метод deleteLast(), вероятно не правильно удаляю последнюю node (я это делаю с помощью ref.next = null;
  • Вопрос задан
  • 773 просмотра
Пригласить эксперта
Ответы на вопрос 2
Может так?
for (int i = 0; i < size - 1; i++) {...}
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
В стеке нет операции удаления последнего элемента. В односвязном списке это вообще максимально затратная операция, зачем она?
Дальше, в тесте ты эту функцию не используешь.
Функция в любом случае реализована в корне неверно.
Нужно учитывать граничный случай size == 1 и обнулять head. Нужно итерироваться (size - 2) раз, чтобы встать на предпоследний элемент, и у него занулить next. Нужно брать value у элемента, следующего за тем, у которого обнуляется next. То есть у самого next'a.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽