2016-07-05 2 views
0
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;    
} 

Выше приведен код реверсивного реверсивного списка реверсирования. Я понял программу, но в конце * head_ref = rest; меня смущает. Позвольте мне уточнить это.Рекурсивное решение для реверсирования Связанный список

Давайте возьмем пример 1-> 2-> 3

in first recursion: first=1, rest=2 
in second recursion: first=2, rest=3 
in last recursion: first=3, rest=null 

и с этого момента мы идем назад, и на каждом шаге мы относим * headRef = остальные , наконец, мы вернулись на первом этапе нашего остальное было 2 и мы относим * headRef = 2 , но нам нужно остальное пункт 3 не 2. Я уверен, что я пропускаю что-то здесь, но я не мог решить эту проблему, пожалуйста, помогите мне

Я попытался печатая адреса первых и остальных. image shows that after recursion, address of rest doesn't change

Заранее спасибо.

Вышеприведенный код от geeksforgeeks ... Там я прокомментировал, но никто мне не помог.

http://imgur.com/Dfb46xD

ответ

0

Обратите внимание, что адрес rest указателя передается в рекурсивном вызове.

К тому времени, как вы вернетесь из рекурсии, указатель rest изменится, указывая на «новый» старт «оставшегося списка».

Это означает, что в вашем примере остаток будет изменен, чтобы указать на элемент 3 на каждом обратном рекурсивном шаге.

+0

Я не понял ... Я написал это на бумаге. Вы можете видеть отсюда http: //imgur.com/Dfb46xD .... Там я четко описал свои сомнения. Пожалуйста, помогите мне разобраться ... –

+0

вы можете видеть, что I K1, K2, K3, K4 - это адреса и добавлены «0» в конце для адреса Rest –

+0

@LokeshS На вашей диаграмме * head_ref получит K4, потому что после возвращения из рекурсии Rest2 будет указывать на K4, т. е. * head_ref3 = rest2. и * head_ref3 = K4, как вы писали на диаграмме. –

Смежные вопросы