我正在使用指针实现链接列表
我需要反转链表,所以我写了旋转(List& l)
但我没有得到我期望的结果
由于输入是
0 1 2 3 4 5 6 7 8 9
我希望有
9 8 7 6 5 4 3 2 1 0
结果,但我得到了
0 9 8 7 6 5 4 3 2 1
由于我找不到我做错了什么,你能指出我的错误吗? 问题似乎从这里开始:(旋转)
while(end->next !=0){
end = end->next;
}
我到达那里,第一个节点是最后一个节点(因为cout<< end-> d;给出me0而不是9)
#include<iostream>
using namespace std;
typedef class Node *List;
struct Node{
int d;
List next;
};
//update : renamed
void reverse(List &l){
/*
start :
a b c d e
b c d e **a**
c d e **b** a
d e **c** b a
Result:
e **d** c b a
*/
// get last node
List end = l;
while(end->next !=0){
end = end->next;
}
//insert first node directly after the original last node
while(l!=end){
List hulp = l;
l = hulp->next;
hulp->next = end->next;
end->next=hulp;
}
}
int main(){
List l = new Node();
int i = 0;
List k = l;
while (i < 10)
{
k->d = i;
k->next = new Node();
k = k->next;
i++;
}
List m = l;
while ( m->next !=0 )
{
cout << m->d << endl;
m = m->next;
}
reverse(l);
m = l;
while ( m->next !=0 )
{
cout << m->d << endl;
m = m->next;
}
}
答案 0 :(得分:3)
这不是迭代链表的典型方式:
while (m->next != 0) {
cout << m->d << endl;
m = m->next;
}
相反,你应该这样做:
while (m != 0) {
cout << m->d << endl;
m = m->next;
}
如果你这样做,你会看到你最初创建的链表实际上是:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
然后您的打印逻辑将其打印为:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
您的反向可能正常运行,产生一个列表:
0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
您打印为:
0, 9, 8, 7, 6, 5, 4, 3, 2, 1
答案 1 :(得分:1)
您错误地初始化了列表。 d = 9的最后一个节点,它应该为空next
,但它实际上有一个new Node
。要解决此问题,请将初始化列表更改为:
for (int i = 0; ; ++i)
{
k->d = i;
if (i >= 9) {
break;
}
k->next = new Node();
k = k->next;
}
更改后,您还需要更改初始AND最终打印(否则您将无法打印最后一个节点)。打印代码应该是(您最好将其放入打印功能以避免重复代码):
for ( ; m; m = m->next)
{
cout << m->d << endl;
}