我试图颠倒以下链接列表的顺序,我已经这样做了,但反向列表似乎没有打印出来。我哪里出错了?
//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;
}
答案 0 :(得分:3)
嗯,我注意到的第一件事就是你在做什么
temp =新节点
然后,在每次互动中:
temp = temp-&gt; next
但你永远不会分配temp-&gt; next
所以当你最终覆盖列表指针时,你肯定会回馈一些有趣的价值。
答案 1 :(得分:1)
你这样做:
while (true){
if (current == NULL){
temp = NULL;
break;
}
temp->number = current->number;
current = current->next;
temp = temp->next;
}
假设它按预期工作。当时间存在时,temp
将是NULL
,对吧?
listpointer = temp; <=> listpointer = NULL;
所以这可能是个问题。
答案 2 :(得分:0)
不检查你的代码我问你这个,你确定你的链表工作正常吗?
答案 3 :(得分:0)
void reverse(Node** list) {
Node* previous=NULL;
Node* current=*list;
while (NULL!=current) {
std::swap(previous, current->next);
std::swap(previous, current);
}
*list=previous;
}
答案 4 :(得分:-1)
为什么不:
衡量列表的长度
用零填充您的列表,直到您的现有列表的大小增加一倍
转到列表的开头,
逐个阅读内容,直至到达原始列表的末尾
:
将当前节点的内容复制到指针前进的节点
((原始列表长度 - 当前节点索引)* 2 + 1)*节点大小
完成后,获取原始列表后第一个节点的指针指向反转列表
无需创建新列表或处理多次迭代或修改现有数据结构(不将其转换为双链表)