我需要使用递归来计算链表中的节点。
unsigned CLL::CountNodes(CNode* val)
{
if(!val)
return 0;
else
return 1 + CountNodes(val->next);
}
所以当我想从另一个函数计算链表中的节点时,我会去:
int main()
{
CLL list();
cout << list.CountNodes(list.head);
}
虽然这看起来有点狡猾,因为类应该能够计算列表,而无需我将一个点传递给列表的头部。这看起来很简单,有一个 for 循环;然而,通过递归,我尝试了:
unsigned CLL::CountNodes(CNode* val = head)
{
if(!val)
return 0;
else
return 1 + CountNodes(val->next);
}
但这没有用,因为 head 不是静态的。然后使 head 静态是一个问题,因为我必须在类之外声明它。
有没有办法解决这个问题? 例如cout << list.CountNodes(); 或者在使用递归时必须始终传入列表的头部?
最佳答案
在 C++ 中总有办法。你可能有两个 overloaded functions ,例如:
unsigned CountNodes (CNode* val)
{
return val ? CountNodes(val->next) + 1 : 0;
}
unsigned CountNodes ()
{
return CountNodes (head);
}
我还建议制作 unsigned CountNodes (CNode* val)
函数 static因为它不需要 CLL
类和 unsigned CountNodes ()
method constant 中的任何内容因为它不会改变对象的状态。
顺便说一句,有一个ternary operator在 C++ 中,它使生活更轻松,代码更具可读性,甚至可能使其更快。所以不是:
if(!val)
return 0;
else
return 1 + CountNodes(val->next);
...你可以这样写:
return val ? 1 + CountNodes(val->next) : 0;
关于关于函数参数和递归的类和默认值的 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7577877/