关于c ++的语法问题

时间:2011-02-18 15:47:40

标签: c++

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 ++的业余人员原谅我的愚蠢问题

3 个答案:

答案 0 :(得分:1)

&是必需的,以便您可以修改从调用者代码传递的指针,使调用者代码看到更改 - 指针通过引用传递,而不是通过值传递。

如果按值传递(无&),调用者将看不到更改,因为被调用的函数将获取传递指针的副本,并且该副本将被丢弃。

我不确定这对于这个特定代码是否至关重要。

答案 1 :(得分:1)

这是对指针的引用。您对ListNode所做的任何更改(使其指向其他内容)都将影响传递给函数的变量。

如果删除此项,则递归调用,例如BinaryTree *leftChild = sortedListToBST(list, start, mid-1);,将修改 list副本,而不是实际 list,代码的行为会有所不同。

答案 2 :(得分:1)

在第一种情况下,ListNode *&正在向ListNode传递引用。语句list = list->next会影响调用者的指针。

这在第一个函数中使用,因此在进入排序的右半部分之前不需要显式推进列表指针。否则你必须让列表指针前进(n / 2)才能进入排序的右半部分。

就第二个函数而言,参数不是引用,因此sortedListToBST播放的游戏实际上不会改变头指针。