Функция обращения к списку должна быть хвостовой рекурсивной, иначе она будет переполнять стек при повторении по длинному списку, как вы заметили.Кроме того, его нужно скомпилировать с включенной оптимизацией или с опцией -foptimize-sibling-calls
gcc.
Хвосто-рекурсивная версия:
Node* reverse(Node* n, Node* prev = nullptr) {
if(!n)
return prev;
Node* next = n->next;
n->next = prev;
return reverse(next, n);
}
Итеративная реверсия списка может быть более легко встроена, и этоне требует никаких опций оптимизации:
inline Node* reverse(Node* n) {
Node* prev = nullptr;
while(n) {
Node* next = n->next;
n->next = prev;
prev = n;
n = next;
}
return prev;
}