Data structures 反转双链接列表
这是我的简单链表程序,它创建了一个双链表,并且可以正常工作Data structures 反转双链接列表,data-structures,linked-list,reverse,doubly-linked-list,Data Structures,Linked List,Reverse,Doubly Linked List,这是我的简单链表程序,它创建了一个双链表,并且可以正常工作 #include <iostream> using namespace std; typedef struct node { int data; node *next; node *prev; }node; void printList(node *temp); int main() { node *head; head = new node; head->prev = NUL
#include <iostream>
using namespace std;
typedef struct node {
int data;
node *next;
node *prev;
}node;
void printList(node *temp);
int main()
{
node *head;
head = new node;
head->prev = NULL;
node *next = head;
node *prev = head;
node *temp = head;
node *current = head;
//creates 100 nodes, last one points to next
for(int x = 0; x<100; x++)
{
temp->data = x;
current = temp;
temp = new node;
current->next = temp;
temp->prev = current;
temp->next = NULL;
}
//=========================================
printList(head);
//=========== set everything to head ===========
current = head;
prev = head;
//============= reverses linked list ============
while(current->next != NULL)
{
next = current->next; //moves next pointer to next node
current->prev = next; //points current's previous to next node
current = next; //set current pointer to next node
current->next = prev; //set current's next to previous node
prev = current; //move prev node up to current
}
//================================================
printList(head);
cout<<"done";
return 0;
}
void printList(node *temp)
{
while(temp->next != NULL)
{
cout<<temp->data<<'\n';
temp = temp->next;
}
}
你的反向算法基本上被破坏了 第一次通过时:
current = head; // Current is pointing at node 0, node0->next is 1 from before
prev = head; // Prev is pointing at node 0
next = current->next; // next is pointing at 1
current->prev = next; // node0->prev is pointing at 1
current = next; // current is pointing at 1
current->next = prev // node1->next is pointing at 0
然后下一关
next = current->next // read up there ^^^ node1->next is pointing at 0
。。。接下来回到节点0
这不是您想要做的-它会使您重复地在节点1和0之间循环,而不是前进到节点2和更高的位置
请注意,如果将此代码放入反向循环,则可以轻松调试此代码:
cout<<"\nStarting iteration"
cout<<"\nNext is at" << next->data
cout<<"\nCurrent is at" << current->data
cout<<"\nCurrent->next is" << current->next->data
cout看看这个简单的解决方案
Node* Reverse(Node* head)
{
Node * curr=head;
Node * prev=NULL,* nxt=NULL;
while(curr!=NULL)
{
nxt=curr->next;
curr->next=prev;
curr->prev=nxt;
prev=curr;
curr=nxt;
}
return prev;
// Complete this function
// Do not write the main method.
}
您是否在代码中的每个有趣点插入了print语句并跟踪了发生的情况?因为您使用的是IDE,所以您是否仔细阅读了代码并确定了IDE“挂起”在代码中的位置。“justhangs”到底是什么意思?我接着在reverse函数中添加了一个print语句。这就是我得到的。有什么想法吗?顺便说一句,您的创建算法将最后一个节点保留未初始化的数据。那以后可能会引起疼痛;)如果电流在节点1。“下一步=当前->下一步”
不会移到节点2旁边吗?这取决于节点1的“下一步”指向的是什么。正如我所说,您将节点1的“下一步”设置为指向节点0。所以当电流指向1,节点1的下一个指向零。。。下一步=当前->下一步带您到节点zero.Awesome。我知道错误在哪里。等我开始工作后再汇报,明白了。谢谢。
Node* Reverse(Node* head)
{
Node * curr=head;
Node * prev=NULL,* nxt=NULL;
while(curr!=NULL)
{
nxt=curr->next;
curr->next=prev;
curr->prev=nxt;
prev=curr;
curr=nxt;
}
return prev;
// Complete this function
// Do not write the main method.
}