С вашей текущей реализацией связанного списка, self.tail
действительно не служит никакой другой цели, кроме ускорения вставки в конце.Вы можете отбросить его, выполнив итерацию всех операций связанного списка с указателем заголовка, как в методе printList()
.Имейте в виду, хотя это и позволяет избежать рекурсии, это по своей сути заставляет все операции быть O (n);это неплохо, так как это типично для упрощенных связанных списков.
Назначение указателя хвоста и узлов, ссылающихся на предыдущие узлы, заключается в том, что вы также можете поддерживать обратный обход.Это простая оптимизация, но улучшение становится только O (n / 2): достаточно хорошо для коротких списков, но бессмысленно в больших списках.Опять же, это обучающий момент использования такой структуры над векторизованными, упорядоченными и древовидными структурами данных.