我的链接列表反向递归方法的代码的问题是什么?

Whats the issue with my code for Linked List reversal Recursive Method?

本文关键字:代码 问题 是什么 问题是 递归方法 链接 列表 我的      更新时间:2023-10-16

我正在尝试使用递归逆转链接列表。当我显示列表后,我只获取原始列表的第一个元素

        void reve(node *a,node *b,node *c,node *h1)
       {
               if(c->next==NULL)
           {
               c->next=b;
               b->next=a;
                return ;
           }
           reve(a->next,b->next,c->next,h1);
           c->next=b;
           b->next=a;
           if(a==h1)
         {
            a->next=NULL;
         }
         return ;
      }` 

这是因为您的调用代码仍然包含一个曾经是首先的节点的指针,但是该节点现在是最后的。
(至少如果代码实际上有效 - 很难跟踪所有这些参数,它们的关系与他们的名字一样神秘。(

如果您将指针返回到新的头部。
您也只需要一个(1(参数。

然后您有三种情况可以处理:

  1. 空列表 - 只需返回空列表;
  2. 单身列表 - 只需返回;
  3. 一般情况。

您可以通过首先逆转列表的其余部分来解决一般情况,从而接收新的头部。

然后,您需要将"新的最后一个元素"的 next指向"此节点",以使" this"节点成为反向列表的下一个元素。
这比听起来要容易 - 您从递归中获得的反向列表中的最后一个节点仍然是该节点的next节点。
(如果不清楚,请在纸上绘制。(

然后,您还需要通过将其next终止列表终止列表。

然后返回您从递归中收到的"新头"。

node* reverse(node* n)
{
    // Empty list:
    if (!n)
    {
        return nullptr;
    }
    // Singleton list:
    if (!n->next)
    {
        return n;
    }
    // General case:
    node* head = reverse(n->next); // Reverse the rest,
    n->next->next = n;             // Attach this node at the end,
    n->next = nullptr;             // Terminate the list,
    return head;                   // Done.
}