Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归反向单链表_C++_Recursion - Fatal编程技术网

C++ 递归反向单链表

C++ 递归反向单链表,c++,recursion,C++,Recursion,我正试图编写一个基本函数,它反转一个递归的单链表。我想知道我是否用正确的方法解决了这个问题?也许有人能给我一些建议 void reverse(Node*& p) { if (!p) return; Node* rest = p->next; if (!rest) return; reverse(rest); p->next->next = p; p->next = NULL; p = rest; } 这不是最有效的方法,但要做到这一

我正试图编写一个基本函数,它反转一个递归的单链表。我想知道我是否用正确的方法解决了这个问题?也许有人能给我一些建议

 void reverse(Node*& p) {
  if (!p) return;
  Node* rest = p->next;
  if (!rest) return;
  reverse(rest);
  p->next->next = p;
  p->next = NULL;
  p = rest;
}

这不是最有效的方法,但要做到这一点,可以使用“next”指针调用reverse方法,直到没有next为止。到达后,设置为“上一个”。从递归返回后,在“上一个”旁边设置。有关示例,请参见。从链接:

Node * reverse( Node * ptr , Node * previous)
{
    Node * temp;
    if(ptr->next == NULL) {
        ptr->next = previous;
        previous->next = NULL;
        return ptr;
    } else {
        temp = reverse(ptr->next, ptr);
        ptr->next = previous;
        return temp;
    }
}
reversedHead = reverse(head, NULL);

即使在C++中,递归解决方案看起来也非常漂亮:

Node* reverse(Node* pivot, Node* backward = 0) {
  if (pivot == 0)  // We're done
    return backward; 
  // flip the head of pivot from forward to backward
  Node* rest = pivot->next;
  pivot->next = backward;
  // and continue
  return reverse(rest, pivot);
}

大多数C++编译器都会进行尾调用优化,所以没有理由相信这比迭代解决方案效率低。

< P>这是你需要的:

Node* reverse(Node* p) {
  if (p->next == NULL) {
    return p;
  } else {
    Node* t = reverse(p->next); // Now p->next is reversed, t is the new head.
    p->next->next = p; // p->next is the current tail, so p becomes the new tail.
    p->next = NULL;
    return t;
  }
}
这可能会有帮助

List
{
public:

    .....

    void plzReverse()
    {
         Node* node = myReverse(head);
         node->next = NULL;
    }

private:

    Node * myReverse(Node * node)
    {
        if(node->next == NULL)
        {
            head = node;
            return node;
        }
        else
        {
            Node * temp = myReverse(node->next);
            temp ->next = node;
            return node;
        }
     }
}
另一个解决方案可能是:

List
{
public:
.....

    void plzReverse()
    {
        Node* node = myReverse(head, head);
        node->next = NULL;
    }

private:

    Node * myReverse(Node * node, Node*& rhead)
    {
        if(node->next == NULL)
        {
            rhead = node;
            return node;
        }
        else
        {
            Node * temp = myReverse(node->next,rhead);
            temp ->next = node;
            return node;
        }
     }
}

以下是将返回值保留为void的解决方案

void reverse(Node*& p) {
  if (!p) return;
  Node* rest = p->next;
  if (!rest) {
      rest = p;
      return;
  }
  reverse(rest);
  p->next->next = p;
  p->next = NULL;
  p = rest;
}

OP强调说“递归”,你说“非递归”。不完全响应。运行代码时会发生什么?代码中似乎有一些错误。Node*&p应该只是Node*p。而且我怀疑你的作业p->next->next=p。基本上你的电流应该指向上一个,上一个应该指向电流。在此之前,您应该保存指向下一步的指针,以便在列表中进一步前进。您可以编辑和合并这两个答案。你也可以花点时间解释为什么会有这样一个问题:我如何合并这两条评论。我是新来的,所以我对这个网站知之甚少。关于解释:由于这段代码递归地反转单链表,我认为这将有助于.thnx合并idea。。现在我知道怎么做了
void reverse(Node*& p) {
  if (!p) return;
  Node* rest = p->next;
  if (!rest) {
      rest = p;
      return;
  }
  reverse(rest);
  p->next->next = p;
  p->next = NULL;
  p = rest;
}