Я пытался написать код, чтобы отменить связанный список, но получить неправильный вывод. Есть что-то, чего я не вижу.
Вот функция
void reverselinklist( struct node **headreverse)
{
struct node *p = *headreverse;
if(p->next == NULL)
{
*headreverse = p;
return;
}
reverselinklist(&(p->next));
p->next->next = p;
p->next = NULL;
}
После функции отображения
Input 409765
Output 4
*headreverse = p
имеет смысла. Вы должны установить *headreverse = p->next
каждый раз, чтобы двигаться вперед, пока не будет достигнут последний узел.
Во всяком случае, я изменил свой код, чтобы он работал:
void reverselinklist(struct node **headreverse)
{
struct node *p = *headreverse;
if(p->next == NULL){
return;
}
*headreverse = p->next;
reverselinklist(headreverse);
p->next->next = p;
p->next = NULL;
}
Для одного списка используйте два двух указателя, чтобы обновить список, поскольку вы не можете вернуться назад.
Вот мой код. Надеюсь, это поможет вам понять концепцию.
void reverselinklist(struct node** head_ref)
{
struct node* first;
struct node* rest;
first = *head_ref;
rest = first->next;
if (rest == NULL)
return;
reverselinklist(&rest);
first->next->next = first;
first->next = NULL;
*head_ref = rest;
}
Если бы я мог уточнить, предложите предложения.
Ваш headreverse не присваивается новому заголовку списка. Обязательно используйте 2 аргумента для своей функции: 1) глава исходного списка 2) текущий узел (тот же, что и ваш headreverse)
if(p->next == NULL)
{
*head = p; //instead of headreverse use head
return;
}
head
и headreverse
? Пожалуйста, объясни.
reverselinklist(&(p->next));
на *headreverse = p->next; reverselinklist(headreverse);
headreverse
как**
?