C++ 反向链接列表?

C++ 反向链接列表?,c++,gcc,linked-list,reverse,C++,Gcc,Linked List,Reverse,我正在尝试反转以下链接列表的顺序,我已经这样做了,但是反转的列表似乎没有打印出来。我哪里出错了 //reverse the linked list #include <iostream> using namespace std; struct node{ int number; node *next; }; node *A; void addNode(node *&listpointer,

我正在尝试反转以下链接列表的顺序,我已经这样做了,但是反转的列表似乎没有打印出来。我哪里出错了

//reverse the linked list
    #include <iostream>
    using namespace std;

    struct node{
        int number;
        node *next;
    };

    node *A;

    void addNode(node *&listpointer, int num){
        node *temp;
        temp = new node;
        temp->number = num;
        temp->next = listpointer;
        listpointer = temp;
    }

    void reverseNode(node *&listpointer){
        node *temp,*current;
        current = listpointer;
        temp = new node;
        while (true){
            if (current == NULL){
                temp = NULL;
                break;
            }
            temp->number = current->number;
            current = current->next;
            temp = temp->next;
        }
        listpointer = temp;
    }

    int main(){
        A = NULL;
        addNode(A,1);
        addNode(A,2);
        addNode(A,3);

        while (true){
            if (A == NULL){break;}
            cout<< A->number << endl;
            A = A->next;
        }
        cout<< "****" << endl;
        reverseNode(A);

        while (true){
            if (A == NULL){break;}
            cout<< A->number << endl;
            A = A->next;
        }

        cout<< "****"<< endl;

        return 0;
    }
//反转链接列表
#包括
使用名称空间std;
结构节点{
整数;
节点*下一步;
};
节点*A;
void addNode(节点*&列表指针,int num){
节点*温度;
temp=新节点;
temp->number=num;
temp->next=listpointer;
listpointer=temp;
}
void reverseNode(节点*&列表指针){
节点*温度,*电流;
当前=列表指针;
temp=新节点;
while(true){
如果(当前==NULL){
温度=零;
打破
}
温度->编号=当前->编号;
当前=当前->下一步;
温度=温度->下一步;
}
listpointer=temp;
}
int main(){
A=零;
addNode(A,1);
addNode(A,2);
addNode(A,3);
while(true){
如果(A==NULL){break;}
下一个是库特号码;
}

如果不检查你的代码,我问你这个问题,你确定你的链接列表工作吗?

如果不检查你的代码,我问你这个问题,你确定你的链接列表工作吗?

嗯,我注意到的第一件事是你正在做

temp=新节点

然后,在每次互动中:

温度=温度->下一步

但您永远不会指定temp->next


因此,当您最终覆盖列表指针时,您肯定返回了一些有趣的值。

好吧,我注意到的第一件事是您正在做

temp=新节点

然后,在每次互动中:

温度=温度->下一步

但您永远不会指定temp->next

因此,当您最终覆盖列表指针时,您肯定会返回一些有趣的值。

您可以这样做:

while (true){
    if (current == NULL){
        temp = NULL;
        break;
    }
    temp->number = current->number;
    current = current->next;
    temp = temp->next;
}
假设它按预期工作。当while存在时,
temp
NULL
,对吗

listpointer = temp; <=> listpointer = NULL;
listpointer=temp;listpointer=NULL;
所以这可能是个问题。

您可以这样做:

while (true){
    if (current == NULL){
        temp = NULL;
        break;
    }
    temp->number = current->number;
    current = current->next;
    temp = temp->next;
}
假设它按预期工作。当while存在时,
temp
NULL
,对吗

listpointer = temp; <=> listpointer = NULL;
listpointer=temp;listpointer=NULL;
所以这可能是个问题。

为什么不:

  • 测量你的清单的长度

  • 用零填充“追加列表”,直到达到现有列表的两倍大小

  • 转到列表的开头

  • 一个接一个地阅读内容,直到到达原始列表的末尾

  • 在原始列表上移动时:

  • 将当前节点的内容复制到指针前进的节点中

    ((原始列表长度-当前节点索引)*2+1)*节点大小

  • 完成后,将原始列表后第一个节点的指针指向反向列表

  • 无需创建新列表或进行多次迭代或修改现有数据结构(不将其转换为双链接列表)

    为什么不:

  • 测量你的清单的长度

  • 用零填充“追加列表”,直到达到现有列表的两倍大小

  • 转到列表的开头

  • 一个接一个地阅读内容,直到到达原始列表的末尾

  • 在原始列表上移动时:

  • 将当前节点的内容复制到指针前进的节点中

    ((原始列表长度-当前节点索引)*2+1)*节点大小

  • 完成后,将原始列表后第一个节点的指针指向反向列表



  • 无需创建新列表或进行多次迭代或修改现有数据结构(不将其转换为双链接列表)

    是的,链表工作正常,只需反馈reverseNode功能。链表似乎在开头插入项目。我不确定这是否是有意的。是的,链表工作正常,只需反馈reverseNode功能。链表似乎在开头插入项目。我不确定这是否是有意的我想这是家庭作业。那么,你可以使用双链表和/或递归吗?不是家庭作业,但我需要知道如何在途中的某个地方这样做。我想这是家庭作业。那么,你可以使用双链表和/或递归吗?不是家庭作业,但我需要知道如何在途中的某个地方这样做。你也是我的内存泄漏。一般来说,你的反向算法不起作用。反向单个链表的最佳方法是递归:关于s.o.这里还有一个相关问题:还有一个简单的迭代算法。请参阅。你也在泄漏内存。一般来说,你的反向算法不起作用。恢复rse单链表是递归的:关于s.o,这里还有一个相关的问题:还有一个简单的迭代算法。参见。1、2和4都需要与列表大小成比例的时间。2需要与之成比例的内存。而且#6似乎需要向后移动或重复迭代到所需的索引(二次)。我认为这个算法不合理。它应该类似于node+((max idx)*2+1)*sizeof(node)=node->number;node++;你不能做指针运算。它是一个链表。此外,指针运算为你处理大小。1、2和4都需要与列表大小成比例的时间。2占用与其成比例的内存。而且#6似乎需要向后移动或重复迭代到所需的索引(二次)。我认为这个算法不合理。它应该是这样的节点+((max idx)*2+1)*sizeof(node)=node->number;node++;你不能做指针运算。它是一个lin