Реверсивный связанный список - C ++ - PullRequest
0 голосов
/ 26 октября 2011

Я написал функцию, которая должна перевернуть список.

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

Нарушение прав доступа (ошибка сегментации) в вашей программе.

Это мое первое задание со связанными списками, поэтому я все еще учусь.

Вот код, который я написал в Dev-C ++:

List::ListNode *List::Reverse_List(ListNode *head)
{
    ListNode *cur = head;
    ListNode *forward = NULL;
    ListNode *previous = NULL;

    while (cur != NULL)
    {
        head = cur; //set the head to last node
        forward = head->next;  //save the next pointer in forward
        cur->next = previous;  //change next to previous
        previous = cur;
        cur = forward;

        cout << "cur= " << cur->item << endl; //this is just to display the current value of cur

        return head;
    }
}

Ответы [ 3 ]

4 голосов
/ 26 октября 2011

Ваш код близок, он возвращается рано.

List::ListNode *List::Reverse_List(ListNode *head) 
{
    ListNode *cur = head;
    ListNode *forward = NULL;
    ListNode *previous = NULL;

    while (cur != NULL) {
        //There is no need to use head here, cur will suffice
        //head = cur; //set the head to last node
        forward = cur->next; //save the next pointer in forward

        cur->next = previous; //change next to previous
        previous = cur;
        cur = forward;

        cout << "cur= " << cur->item << endl; //this is just to display the current value of cur

        //don't return here you have only adjusted one node
        //return head;
    }

    //at this point cur is NULL, but previous still holds the correct node
    return previous;
}
0 голосов
/ 23 октября 2013

Извините за поздний ответ, и я уверен, что вы уже нашли ответ, но он может быть полезен для других.Ответ - это просто принятие оператора return (т.е. return head;) из цикла while, чтобы решить вашу проблему.Хотя есть способы, позволяющие избежать лишних указателей и назначений для оптимизации кода.

0 голосов
/ 27 октября 2011

Сегодня у всех должно быть одно и то же домашнее задание.

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

Вот что должно произойти (с алгоритмом, который я бы использовал)

[] = head () = текущий

([1]) -> 2-> 3-> 4, [2] -> (1) -> 3-> 4, [3] -> 2 -> (1) -> 4, [4]-> 3-> 2 -> (1) сделано, потому что у текущего сейчас нет нового следующего

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