Сторнирование связанного списка (путем рекурсии) не работает

0

Я пытался написать код, чтобы отменить связанный список, но получить неправильный вывод. Есть что-то, чего я не вижу.

Вот функция

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
  • 0
    Почему вы передаете headreverse как ** ?
  • 0
    Итак, в чем вопрос?
Показать ещё 1 комментарий
Теги:
pointers
linked-list
heap-memory

3 ответа

2
Лучший ответ

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

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

Вот мой код. Надеюсь, это поможет вам понять концепцию.

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

Если бы я мог уточнить, предложите предложения.

0

Ваш headreverse не присваивается новому заголовку списка. Обязательно используйте 2 аргумента для своей функции: 1) глава исходного списка 2) текущий узел (тот же, что и ваш headreverse)

if(p->next == NULL)
{
    *head = p; //instead of headreverse use head
    return;
}
  • 0
    в чем разница между head и headreverse ? Пожалуйста, объясни.
  • 0
    head - глава начального связанного списка. Headreverse, который вы использовали в нем, на самом деле является просто узлом, на который вы ссылаетесь в списке. Предположим, что ваш связанный список 1-> 2-> 3-> 4, теперь ваша программа имеет значение 1 <-2 <-3 <-4, но ваша голова не меняется. Вывод: все, что вы изменяете в своей программе, - это следующий указатель каждого узла. Так что сделайте то, что я предложил, или измените список обращений reverselinklist(&(p->next)); на *headreverse = p->next; reverselinklist(headreverse);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню