Хитрость в решении рекурсивных проблем - притворяться, что вы уже закончили. Чтобы решить эту домашнюю работу самостоятельно, вам нужно ответить на три вопроса:
- Как перевернуть пустой список? (то есть список с
lh
, установленным на NULL
)?
- Как перевернуть список только с одним элементом?
- Если кто-то может перевернуть все элементы в списке, кроме начального для вас, где вы добавляете первый элемент из начального списка в предварительно перевернутую «хвостовую» часть списка?
Вы уже ответили на первые два вопроса: NULL
и lh
- правильные ответы. Теперь подумайте о третьем:
else {
node *reversedTail = reverseList(lh->next);
...
}
На данный момент, reversedTail
содержит предварительно перевернутый хвост вашего списка. Все, что вам нужно сделать, это установить lh-> рядом с NULL, добавить его в конец списка, который вы держите, и вернуть reversedTail
. Окончательный код выглядит так:
else {
node *reversedTail = reverseList(lh->next);
node *p = reversedTail;
while (p->next) p = p->next;
p->next = lh;
lh->next = NULL;
return reversedTail;
}