Рекурсивное обращение по списку - PullRequest
0 голосов
/ 20 мая 2018

Этот код с этого сайта.

void recursiveReverse(struct Node** head_ref)
{
    struct Node* first;
    struct Node* rest;

    /* empty list */
    if (*head_ref == NULL)
       return;   

    /* suppose first = {1, 2, 3}, rest = {2, 3} */
    first = *head_ref;  
    rest  = first->next;

    /* List has only one node */
    if (rest == NULL)
       return;   

    /* reverse the rest list and put the first element at the end */
    recursiveReverse(&rest);
    first->next->next  = first;  

    /* tricky step -- see the diagram */
    first->next  = NULL;          

    /* fix the head pointer */
    *head_ref = rest;              
}

Я не понимаю, почему после последнего рекурсивного вызова значение rest остается прежним?Я понимаю, что recursiveReverse (& rest) передает фактический адрес отдыха, но разве этот адрес не используется только head_ref?Это означает, что каждый рекурсивный вызов имеет свою собственную локальную копию first и rest, и поэтому * head_ref = rest не должен работать, потому что значение rest будет постоянно меняться.

Где мое понимание не так?

Редактировать: Добавление некоторых моих каракулей.

enter image description here

1 Ответ

0 голосов
/ 20 мая 2018

Я не понимаю, почему после последнего рекурсивного вызова значение rest остается неизменным?

Оно попадает в базовый случай рекурсивного вызова и немедленно возвращает.

 /* List has only one node */
    if (rest == NULL)
       return;  

Каждый рекурсивный вызов имеет свою собственную локальную копию first и rest?

Да, точно. Посмотрите, как это работает.

*head_ref = rest не должно работать, поскольку значение rest будет постоянно меняться.

Нет.В конечном итоге он указывает на последний элемент связанного списка, который будет первым элементом, на который я назову крайний правый узел (в неизмененном списке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...