Обращение к двусвязному списку не показывает первый узел на выходе

#c #linked-list

#c #связанный список

Вопрос:

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

Я использовал структуру для создания узлов, я могу сказать, что я правильно меняю местами указатели prev и next, но это не дает ожидаемого результата.

 #include<bits/stdc  .h>
using namespace std;
struct Node {
    int data;
    Node *next;
    Node *prev;
    Node(int x) {
        data =x;
        next=NULL;
        prev=NULL;
    }
};
void traverse(Node *head)
{
    while(head!=NULL)
    {
        cout<<head->data<<" ";
        head=head->next;
    }
}
 

Функция Reverse для обращения к двусвязному списку

 Node *reverse(Node *head)
{
    if(head==NULL || head->next==NULL)
        return head;
    Node *prev = NULL;       // previous serve two purposes first it will help in swapping
    Node *curr = head;      //  and in the end it will help to locate the last node when current becomes null
    while(curr!=NULL)
    {
        cout<<"reversing a noden";
        prev = curr->prev;
        curr->prev=curr->next;
        curr->next=prev;
        
        curr=curr->prev;
    }
    cout<<"yes";
    return prev;
}
 

вставьте функцию begin, чтобы добавить узел в начало связанного списка

 Node *insertBegin(Node *head,int data)
{
    Node *tmp = new Node(data);
    tmp->next=head;
    if((head!=NULL))
        head->prev=tmp;
    return tmp;
}

int main()
{
//  Node *head = new Node(10);
//  head->next=new Node(20);
//  head->next->prev=head;
//  head->next->next =new Node(30);
//  head->next->next->prev=head->next->next;
    
    Node *head =NULL;
    head=insertBegin(head,10);
    head=insertBegin(head,20);
    head=insertBegin(head,30);
    traverse(head);
    //linked list before reverse 30 20 10
    head = reverse(head);
    traverse(head);
    //linked list after traverse as showing on output 20 30
    return 0;
}
 

Ответ №1:

Вы возвращаете второй узел в списке вместо первого узла. Вы возвращаете самое последнее хорошее значение curr->prev , когда вы должны возвращать самое последнее хорошее значение curr (которое будет главой перевернутого списка).

Минимальное изменение кода, вероятно,:

return prev->prev;

Комментарии:

1. О, спасибо, я забыл, что prev не будет перемещен вперед, когда curr станет нулевым, поскольку цикл while не будет выполняться для обновления значения prev, и нам придется вручную увеличивать указатель prev на prev = prev-> prev , было бы лучше, если бы я объявил prev с чем-то другим, например, behindCurr, как явозможно, я перепутал его с предыдущим указателем узлов.