链接列表程序,不确定输出/功能

时间:2017-09-13 19:54:00

标签: recursion linked-list

我想通过输入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;
}

1 个答案:

答案 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很清楚。