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. 
}