Я нашел несколько реализаций обратного связанного списка в php, и большинство из них одинаковы с некоторыми небольшими отличиями, как это:
public function reverse() {
if ( $this->_firstNode !== NULL ) {
if ( $this->_firstNode->next !== NULL ) {
$reversed = $temp = NULL;
$current = $this->_firstNode;
while ( $current !== NULL ) {
$temp = $current->next;
$current->next = $reversed;
$reversed = $current;
$current = $temp;
}
$this->_firstNode = $reversed;
}
}
}
Но я думаю, что это можно изменить на это:
public function reverse() {
while ( $this->_firstNode->next !== NULL ) {
$oldFirstNode = $this->_firstNode;
$this->_firstNode = $oldFirstNode->next;
$oldFirstNode->next = NULL;
$this->_firstNode->next = $oldFirstNode;
}
}
Я прав?
Ваш код не работает по двум причинам:
$this->_firstNode
является NULL
,$this->_firstNode->next
со значением $oldFirstNode
и в следующей итерации вы проверяете $this->_firstNode->next !== NULL
, который отличается от NULL
так как это значение $oldFirstNode
и функция продолжит цикл на этих двух узлах.Для алгоритма, подобного этому, лучший подход — использовать бумагу и карандаш, рисовать элементы списка и переменные, указывающие на них, и обновлять их, следуя алгоритму шаг за шагом.
В заключение отметим, что если алгоритм всегда используется для определенной базовой задачи, очень трудно найти новый, более эффективный алгоритм.
Других решений пока нет …