我想通过输入1,2,3,4,5的链表来运行它。我想知道funcA的输出与上面的链表以及程序实际正在做什么。我相信它要么颠倒链表的顺序,要么轮换链表中的所有项目,如2,3,4,5,1这是正确的吗?谢谢你的帮助!
struct Node {
int value;
Node *next;};
Node* funcA(Node* in) {
Node *out = in;
while (out->next != nullptr) {
out = out->next;
}
funcB(in)->next = NULL;
return out;
}
Node* funcB(Node* in) {
if (in->next != nullptr) {
funcB(in->next)->next = in;
}
return in;
}
答案 0 :(得分:0)
为了理解funcA()
,我们首先需要了解funcB()
。
funcB
只需反转列表并返回反转列表的尾部(或原始列表的头部)。
它通过调用自身(递归)直到它到达原始列表的尾部来完成它。然后,递归开始折叠并重新分配每个节点的next
指针以指向它之前的节点。
funcA
while循环的目标是将指针out
保存到输入列表的尾部。所以目前的状态是:
List: 1 --> 2 --> 3 --> 4 --> 5 --> NULL
^ ^
in out
然后,它以列表的头部作为参数调用funcB
。我们知道funcB
将反转其给定的列表并返回其最后一个元素。所以在funcB(in)
之后我们会得到:
List: 1 <--> 2 <-- 3 <-- 4 <-- 5
^ ^
in out
,返回值是节点1
。因此,在funcB(in)->next = NULL
之后,我们会得到:
List: NULL <-- 1 <-- 2 <-- 3 <-- 4 <-- 5
^ ^
in out
然后,返回out
。总的来说 - funcA
正在取一个链表,将其反转并返回一个指向反向列表5
的头部的指针。
当谈到链接列表(和一般指针)时,最好的理解方法是使用铅笔和纸张 - 只需在纸上绘制每个列表的状态和其他指针,一步一步,直到它为止#39很清楚。