我试图使用递归来反转链表(不是迭代)。最初,我将我的头指针设置为全局变量,因此我不需要返回头部。这个版本工作正常,所以我想实现一个将head作为局部变量的版本。代码如下:
void Reverse(node* &head, node *p)
{
if(p == NULL) return; //nothing in list
if(p->link == NULL)
{
head = p;
return;
}
Reverse(head, p->link);
node *q = p->link;
q->link = p;
p->link = NULL;
}
//some code to set local var head to a linked list
Reverse(head, head);
它工作正常,但看起来很麻烦。我已经尝试了一些方法,只使用一个变量,但它不起作用。
void Reverse(node* &head)
{
if(head == NULL) return;
node *p = head;
if(p->link == NULL)
{
head = p;
return;
}
Reverse(p->link);
node *q = p->link;
q->link = p;
p->link = NULL;
}
//some code to set local var head to a linked list
Reverse(head);
Print(head); //output only last element in list
有没有其他方法可以通过引用变量一次传递来实现它?另外,你能解释为什么第二个代码输出像它一样吗? !谢谢你的编辑: 所以这似乎不是一个很好的方法。所以我能想到的最后一种方法是通过value参数传递并返回结果(假设head是local)。我试着这样做:
node* Reverse(node *p)
{
if(p == NULL) return p; //nothing in list
if(p->link == NULL)
{
return p;
}
Reverse(p->link);
node *q = p->link;
q->link = p;
p->link = NULL;
//control may reach end of non-void fucntion
}
但我无法想出绕过"控制可能达到无效功能的结束"问题。有什么帮助吗?
答案 0 :(得分:1)
一个简单的解决方案:您可以在designtime
:
Reverse