Комментарии уже хорошо объясняются, пытаясь проиллюстрировать это немного яснее:
1 > 2 > 3 > 4 > NULL
^
head
Теперь вы переворачиваете список, в результате чего:
4 > 3 > 2 > 1 > NULL
^ ^
temp head
Поскольку вы никогда не меняли head
, он по-прежнему указывает на тот же узел, на который указывал до обращения к списку, но после обращения к списку этот узел теперь является последним.
Примечание: забыть о переназначении - довольно распространенная ошибка, поэтому рекомендуется инкапсулировать связанный список в отдельный класс:
class LinkedList
{
Node* _head;
public:
class Node; // just as you have already
void reverse() // now a member function
{
//reverse as you did before
// encapsulating the assignment: (!)
_head = newHead;
}
Node* head() { return _head; }
};
LinkedList l;
// ...
Node* tmp = l.head();
l.reverse();
// tmp variable points to tail...
// expecting tmp pointing to head is still an error,
// and there is no way to prevent it
// BUT the correct head can always be re-acquired:
head = l.head();
Редактировать в ответ на комментарий:
Если вы хотите создать новый список, вам нужно будет скопировать узлы:
Node* createReversedList(Node* head)
{
Node* cur = NULL;
while(head)
{
Node* tmp = new Node(*head);
// (provided you have an appropriate copy constructor)
tmp->next = cur;
cur = tmp;
}
return cur;
}
Обратите внимание на новое имя, reverse
скорее подразумевает изменение исходного списка, как вы это сделали.