BinaryTree* sortedListToBST(ListNode *& list, int start, int end) {
if (start > end) return NULL;
// same as (start+end)/2, avoids overflow
int mid = start + (end - start) / 2;
BinaryTree *leftChild = sortedListToBST(list, start, mid-1);
BinaryTree *parent = new BinaryTree(list->data);
parent->left = leftChild;
list = list->next;
parent->right = sortedListToBST(list, mid+1, end);
return parent;
}
BinaryTree* sortedListToBST(ListNode *head, int n) {
return sortedListToBST(head, 0, n-1);
}
这是将排序列表转移到BST的功能。
我不明白第一行。为什么“ListNode *&
”......如果只是“ListNode*
”为什么错?
谢谢你的任何解释。
感谢。还有一个问题..如果只是“ListNode& list”它一定是错的,为什么我们也需要“*”,... C ++的业余人员原谅我的愚蠢问题
答案 0 :(得分:1)
&
是必需的,以便您可以修改从调用者代码传递的指针,使调用者代码看到更改 - 指针通过引用传递,而不是通过值传递。
如果按值传递(无&
),调用者将看不到更改,因为被调用的函数将获取传递指针的副本,并且该副本将被丢弃。
我不确定这对于这个特定代码是否至关重要。
答案 1 :(得分:1)
这是对指针的引用。您对ListNode所做的任何更改(使其指向其他内容)都将影响传递给函数的变量。
如果删除此项,则递归调用,例如BinaryTree *leftChild = sortedListToBST(list, start, mid-1);
,将修改 list
的副本,而不是实际 list
,代码的行为会有所不同。
答案 2 :(得分:1)
在第一种情况下,ListNode *&
正在向ListNode传递引用。语句list = list->next
会影响调用者的指针。
这在第一个函数中使用,因此在进入排序的右半部分之前不需要显式推进列表指针。否则你必须让列表指针前进(n / 2)才能进入排序的右半部分。
就第二个函数而言,参数不是引用,因此sortedListToBST播放的游戏实际上不会改变头指针。