2016-09-15 4 views
1

Я видел эту рекурсивную программу (на языке C) вРекурсивный метод реверсирования односвязного списка?

http://www.geeksforgeeks.org/write-a-function-to-reverse-the-nodes-of-a-linked-list/

реверса односвязанны список.

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;} 

На этом этапе в программе,

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

Могу ли я написать "латентный> следующий = первый;" вместо "первого> next-> следующей = первым;"?

Возможно ли какое-либо значение написания «first-> next-> next = first;»?

+0

http://stackoverflow.com/questions/37725393/reverse-linked-list-recursive – BLUEPIXY

ответ

0

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

Назначение first->next на rest не заставляет их быть всегда одинаковыми. Ваш непосредственно предшествующий отчет передает указатель на номер rest на номер recursiveReverse. Короче говоря, вы ожидаетеrest изменить.

rest должен теперь указывать на головку оставшейся части с обратным адресом. Это не first->next; теперь должен быть конец перевернутого списка, где rest является главой этого списка.

Это объясняет ситуацию достаточно хорошо? Если нет, пожалуйста, введите несколько заявлений для печати, чтобы проиллюстрировать, что делает ваша программа в каждом случае.

+1

C не имеет доступа к ссылке. A * указатель * на 'rest' передается по значению, что не то же самое. Однако это дает ту же возможность, что значение 'rest' изменено в вызывающем абоненте. –

+0

Относительно: «Что заставляет вас думать [...]« Возможно, тот факт, что он работает таким образом во многих других областях: функциональное программирование и математика, например. Наличие функций с побочными эффектами/неинтуитивно. Пожалуйста, перепишите свой ответ менее снисходительным способом. –

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