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