一道C++题,请高手详细解释一下
#include<iostream>
using namespace std;
struct Item
{
char c;
Item *next;
};
Item *Routine1(Item *x)
{
Item *prev = NULL, *curr = x;
while (curr) {
Item *next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
void Routine2(Item *x)
{
Item *curr = x;
while (curr) {
cout << curr->c << "";
curr = curr->next;
}
}
void main(void)
{
Item *x,
d = {'d', NULL},
c = {'c', &d},
b = {'b', &c},
a = {'a', &b};
x = Routine1(&a);
Routine2(x);
}
结果是:dcba,请问为什么,我大体能看懂第一个输出d,为什么后面接着是cba,谢谢,请详细解释一下
[解决办法]
先看第一个函数 Item *Routine1(Item *x); 首先把a传进去。
Item *prev = NULL, *curr = x;
while (curr)
{
Item *next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
循环执行一次后:next指向b; a->next指向NULL; prev指向a; curr指向b;
循环执行第二次:next指向c; b->next指向a; prev指向b; curr指向c;
依次执行,最后: next指向NULL; d->next指向c; prev指向d; curr指向NULL
也就是说经过第一个函数,函数返回了d,并且d->next = &c; c->next = &b; b->next = &a;
a->next = NULL;
[解决办法]
开始构造了一个链表 a->b->c->d->NULL
Routine1 反向了这个链表
NULL<-a<-b<-c<-d
(cur)a的next 原本指向 b,先保存a.next 为Item *next ,是防止丢失b,
然后a.next断开指向b,让其指向pre(NULL),curr->next = prev;
这样a.next就不在指向b,而指向NULL更改了方向。
然后a变成pre,b变成cur.
下一次循环式 b断开指向c的next 改为指向 pre (a)
……
依次将链表的指向翻转。