递归反向单链接列表

时间:2012-10-25 04:58:57

标签: 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;
}

6 个答案:

答案 0 :(得分:6)

这不是最有效的方法,但要做到这一点,你可以用“下一个”指针调用反向方法,直到没有下一个。在那里,设置在前一个旁边。从递归返回后,设置在上一个旁边。有关示例,请参阅recursive version here。从链接:

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);

答案 1 :(得分:4)

这可能会有所帮助

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;
        }
     }
}

答案 2 :(得分:3)

这就是你需要的:

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;
  }
}

答案 3 :(得分:1)

递归解决方案看起来非常漂亮,即使在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 ++编译器都进行尾部调用优化,因此没有理由相信这样做效率低于迭代解决方案。

答案 4 :(得分:0)

linkedList *reverseMyNextPointer(linkedList *prevNode,linkedList *currNode)
{
    linkedList *tempPtr;
    if(currNode == NULL)
    {
        return prevNode; 
    }
    else
    {
        tempPtr = currNode->next;
        currNode->next = prevNode;
        return reverseMyNext(currNode,tempPtr);
    }
}

head = reverseMyNextPointer(NULL,head);

答案 5 :(得分:0)

以下是将返回值保留为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;
}