Подумайте об инвариантах вашего стека: tail
указывает на последний элемент.
Операция pop удаляет последний элемент - это означает, что нам нужно перенастроить tail
. как нам это сделать? Имея двусвязный список, мы могли бы просто следовать указателю назад к предыдущему узлу - но, как ясно показывает ваша иллюстрация, такой стрелки назад к предыдущему узлу в односвязном списке нет.
Вместо этого нам нужно начинать с head
(единственный другой узел, для которого мы держим указатель) и выполнять итерацию до тех пор, пока мы не достигнем второго до последнего узла, а затем установить tail
для указания на этот узел.