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

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

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;
  • Вопрос задан
  • 806 просмотров
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
28 нояб. 2024, в 18:46
3000 руб./за проект
28 нояб. 2024, в 17:46
10000 руб./за проект
28 нояб. 2024, в 17:38
12000 руб./за проект