#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, как явозможно, я перепутал его с предыдущим указателем узлов.