我对此代码有疑问。 {(1}},在insert()函数中, 我很难理解它的含义。 这是“指向节点结构的指针的引用”吗?
但为什么在这里Node* &head
他使用getDepth(Node *head)
?
这是一个好习惯吗?如果可能的话,写出来的更好的方法是什么?
谢谢!
Node *head
答案 0 :(得分:2)
如果您通过Node *head
而不是Node* &head
,并且如果更改了“head”,则main
功能将无法使用此更改。
如果您希望这些更改可用,请return head
或传递Node* &head
或Node **head
。
在getDepth()
中,无需更改“head”指针。所以通过Node *head
可以正常工作。
答案 1 :(得分:1)
这正是它的原因:对指向Node
的指针的引用。它允许您通过引用传入Node*
,这样当您修改函数内部的指针时,修改将在外部看到。
涉及参考参数的简单示例:
void inc(int& x) {
x++;
}
如果我有变量int y = 0;
,请将其与inc(y)
一起传递,然后检查y
之后的值,它将具有值1
。如果参数不是引用类型,则值为0
,因为只有inc
内的副本才会被修改。
你的情况是一样的。您通过引用传递Node*
,以便您可以修改指针并使其在外部可见。
答案 2 :(得分:1)
此构造表示对具有Node *类型的变量的引用。问题是,如果你只是声明函数insert的参数作为Node *然后在函数内部,那么这个参数可以作为局部变量。因此退出函数后,它的任何更改都将丢失。所以在这种情况下,结果是原始变量头不会改变。通过引用传递指针可以保证函数内部的任何头部变化都保留在原始变量中。
答案 3 :(得分:0)
编写此代码的人是一个混蛋,编写了不可读的代码。太可怕了。
但是,Node *& head是对指向节点的指针的引用。所以基本上它通过引用将指针传递给头部,因此你可以改变head ptr的值。
例如:
Node *A = NULL;
insert(A,10);
//now A has changed, A != NULL;
答案 4 :(得分:0)