перевернуть список без копирования (рекурсивный метод) - PullRequest
0 голосов
/ 31 мая 2019

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

    void reverserecv2(pt* listhead){
       pt curr=*listhead,suiv;
       if(curr && curr->next){
         suiv=curr->next;
         reverse(&(curr->next));
         suiv->next=curr;
        *listhead=curr->next;
         suiv->next->next=NULL;
        }
      }
   // my  structure : 

         typedef struct node{
            int data;
            struct node* next;
            }node;
            typedef node* pt ;

1 Ответ

0 голосов
/ 31 мая 2019

Если вы распечатываете небольшие данные, это может помочь вам понять, что они делают;где * назначен заголовок, вставьте в строку:

printf(“*(%p) = %p\n”, listhead, curr->next);

Я сделал для списка len 4:

*(0x79628344) = 0x79628320
*(0x79628354) = 0x79628320
*(0x79628364) = 0x79628320
*(0xbff92bd0) = 0x79628320

Мы видим, что сам заголовок имеет несколько различных значений;и когда мы смотрим на рекурсивный вызов, это имеет смысл.Каждый раз, когда он вызывается с использованием next в качестве заголовка списка, каждый узел обновляется.Из моего рисунка видно, что адрес, который не является смежным с остальными, является адресом стека, где находится конечный заголовок списка.

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