我正在尝试使用递归来反转链接列表。当我在反转后显示列表时,我只获取原始列表的第一个元素 `
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 ;
}`
答案 0 :(得分:2)
这是因为你的调用代码仍然保存一个指向以前是第一个节点的指针,但该节点现在是最后一个。
(至少如果代码确实有效 - 很难跟踪所有这些参数,他们的关系和他们的名字一样神秘。)
如果返回指向新头的指针,则更容易实现 您还只需要一(1)个参数。
然后你要处理三个案件:
您可以通过首先反转列表的其余部分来接收新的头部来解决一般情况。
然后你需要让“new last element”的next
指向“this”节点,以使“this”节点成为颠倒列表的下一个元素。
这比听起来容易 - 从递归中获得的反向列表中的最后一个节点仍然是此节点的next
节点。
(如果不清楚,请在纸上画画。)
然后你还需要让“this”节点通过将其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.
}