2011-02-18 75 views
0
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*」爲什麼錯了? 感謝您的任何解釋。關於C++的語法問題

謝謝。還有一個問題。如果只是「ListNode &列表」那一定是錯的,我們爲什麼需要「*」也..的C++愛好者原諒我,我愚蠢的問題

回答

1

這是對指針的引用。對ListNode所做的任何更改(使其指向其他內容)都會影響傳遞給該函數的變量。

如果你刪除了這個,遞歸調用,例如BinaryTree *leftChild = sortedListToBST(list, start, mid-1);,將修改副本list而不是實際list,代碼的行爲將有所不同。

1

&是必需的,這樣就可以修改指針從調用者代碼傳遞,以便調用者代碼將看到更改 - 指針通過引用傳遞,而不是按值傳遞。

如果按值傳遞(無&),調用者將看不到更改,因爲被調用的函數將獲得傳入指針的副本,並且該副本將被丟棄。

我不確定這是否對此特定代碼至關重要。

1

在第一種情況下,ListNode *&正在將引用傳遞給ListNode。語句list = list->next影響調用者的指針。

這是在第一個函數中使用的,因此在進入排序的右半部分之前不需要顯式地推進列表指針。否則,在進入排序的右半部分之前,必須將列表指針前進(n/2)。

就第二個函數而言,參數不是參考,所以sortedListToBST播放的遊戲不會實際更改頭指針。