我无法使用以下代码反转给定的链接列表.有人能指出代码中的错误吗



我无法使用以下代码反转给定的链表。有人能指出代码中的错误吗?

#include<iostream>
using namespace std;
class Node{
public:
int data;
Node* next;
Node* prev;
Node(int d)
{
this->data=d;
this->next=NULL;
this->prev=NULL;
}
};
void insertathead(Node* &head,int d)
{
Node* temp= new Node(d);
temp->next=head;
head->prev=temp;
head=temp;
}
void insertattail(Node* &tail, int d)
{
Node* newnode=new Node(d);
newnode->prev=tail;
tail->next=newnode;
tail=newnode;
}
void insertatmiddle(Node* &head, int position, int d)
{
Node* temp=head;
Node* newnode=new Node(d);
int count=1;
while(count<position-1)
{
temp=temp->next;
count++;
}
newnode->prev=temp;
temp->next->prev=newnode->next;
newnode->next=temp->next;
temp->next=newnode;
}
void reverse(Node* &head)
{
Node* current=head;
Node* temp=NULL;
while(current!=NULL)
{
temp = current->prev; 
current->prev = current->next; 
current->next = temp;             
current = current->prev;
}
head=temp->prev;

}
void display(Node* head)
{
Node* temp=head;
while(temp!=NULL)
{
cout<<temp->data<<" ";
temp=temp->next;
}
cout<<endl;
}
int main()
{
Node* node1=new Node(10);
Node* head=node1;
Node* tail=node1;
insertathead(head,11);
display(head);
insertathead(head,12);
display(head);
insertathead(head,13);
display(head);
insertathead(head,14);
display(head);
insertattail(tail,15);
display(head);
insertatmiddle(head,3,20);
display(head);
cout<<head->data<<endl;
cout<<tail->data<<endl;
reverse(head);
display(head);

return 0;
}

在这段代码中,当我注释掉insertmiddle函数时,reverse函数能够完全反转链表。但在两者之间添加一个节点后,reverse函数会反转链表,直到只反转该特定节点。有人能找出这种情况下的错误吗?

insertatmiddle的代码中

newnode->prev=temp;
temp->next->prev=newnode->next;  // newnode->next is always NULL here
newnode->next=temp->next;
temp->next=newnode;

你犯了一个错误。尝试

newnode->prev=temp;
newnode->next=temp->next;
temp->next->prev=newnode;
temp->next=newnode;

顺便说一句,如果代码是为你准备的,只要你明白自己在做什么,一切都很好,但你实现的方式

int count=1;
while(count<position-1) { ... }

这让我有点困惑,因为后面附加了newnode的链接tempposition = 012head,我发现这很不寻常。

相关内容

  • 没有找到相关文章

最新更新