Я готовлюсь к экзамену со связанными списками в C. Я нашел себя «рецензентом», у которого был этот фрагмент кода.Что касается жизни, я не могу понять, как все наоборот.Вот оно ... это из проблем со связанным списком мистера Ника Парланте (взято из библиотеки СНГ, Стэнфорд).Я добавлю комментарии г-на Ника.
Решение RecursiveReverse ()
Вероятно, самой сложной частью является принятие концепции, что RecursiveReverse (& rest) фактически полностью изменяет остальное.Затем есть хитрость, чтобы получить один передний узел до конца списка.Сделайте рисунок, чтобы увидеть, как работает трюк.
void RecursiveReverse(struct node** headRef) {
struct node* first;
struct node* rest;
if (*headRef == NULL) return; // empty list base case
first = *headRef; // suppose first = {1, 2, 3}
rest = first->next; // rest = {2, 3}
if (rest == NULL) return; // empty rest base case
RecursiveReverse(&rest); // Recursively reverse the smaller {2, 3} case
// after: rest = {3, 2}
first->next->next = first; // put the first elem on the end of the list
first->next = NULL; // (tricky step -- make a drawing)
*headRef = rest; // fix the head pointer
}
Я сделал бесчисленные рисунки в попытках отследить, что происходит, и я просто не могу понять, как RecursiveRest (& rest) фактически полностью изменяет остальное.Пожалуйста помоги.Я очень разочарован.То, что я в конечном итоге получаю, это меньшие "остальные" ... и ничего не меняется.Заранее большое спасибо.