2016-03-30 112 views
0

我使用幾乎所有的遞歸函數創建一個鏈表,並且我迷上了複製構造函數。鏈表有一個頭部和一個尾部虛擬節點。我有:遞歸複製鏈接列表

/* Recursively duplicates the list. */ 
void duplicateNodes(const SortedList& o, Node * const copyIter) { 

    if (copyIter != head) { 
     duplicateNodes(o, copyIter->previous); 
    } 

    tail = tail->next = createNode(tail, copyIter->data, nullptr); 
    size = o.size; 

} 

我的拷貝構造函數:

SortedList(const SortedList& o) { 
    duplicateNodes(o, o.tail); 
} 

提前感謝!我還沒完全理解遞歸。

+0

如果'head'和'tail'是'SortedList'的私有成員,我建議使用'_tail'或'm_tail'等前綴表示法。 – Dagrooms

+0

或者總是用this-> tail來表示它。另外我討厭人們在同一條線上使用兩個作業,閱讀和跟隨是很可怕的。 –

+0

順便說一句,在我看來,你在這裏得到的是一個無止境的循環,只是自己反覆調用自己。你的第一個if語句可能是真的,你的遞歸將繼續調用duplicateNodes –

回答

0

我要描述答案,但我會留下編碼給你,因爲它看起來像功課,你可能應該自己做。我希望那些被允許的權力。遞歸應該總是有停止條件,最好將它放在函數的開頭。遞歸函數duplicateNodes不需要整個列表o,只是它的頭部。 它需要做的事情是基本遍歷o的節點並在我們的列表中創建一個相應的節點,因此duplicateNodes將使用nodeBeingCopied-> next調用它自己。停止條件顯然是nodeBeingCopied == null(儘管nodeBeingCopied-> next == null也可以在函數結束時起作用)。遞歸函數的主體將創建一個新節點並將其添加到列表的末尾。每增加一個節點到我們的列表中,大小應該增加一個。 希望這給你足夠的信息來做你自己的。如果你需要更多的幫助,請問。