2012-12-22 72 views
3

這段代碼應該追加兩個鏈表,我完全看不到這個代碼如何附加兩個Cell Structs作爲參數傳遞,因爲沒有操作正在發生在第二個參數上。它只是要求在第一個單元中的下一個節點 - 所以這是如何工作的?C++:遞歸追加鏈表

void Append(Cell *& first, Cell* second) 
{ 
    if (first == NULL) 
    { 
    first = second; 
    } 
else { 
    Append(first->next, second); 
    } 
} 

回答

1

該函數的else塊保持跟在next指針first,直到它到達該列表的末尾。也就是說,直到first->nextNULLelse沒有得到執行。

現在在if塊中的基本情況。當first->nextNULL時,它將該指針更改爲指向second,這可能是另一個列表中的第一個元素。

有一些影響的原因是因爲first->next指針是通過引用傳遞的。修改指針將修改列表末尾的實際指針,而不僅僅是修改副本。

+0

是讓現在意義上的我越去想它。 –

1

它遞歸直至first是在第一列表中的指針next最後Cell的,它設定爲指向在第二第一Cell的參考。它不需要操縱second(假設它是一個單獨的鏈表)。

1

這是一個遞歸算法,直到第一個列表(else分支)結束;一旦找到結尾(first==NULL),第二個列表的第一個元素將鏈接到第一個元素的最後一個元素,從而獲得兩個原始列表的連接列表。

1

第二個列表不需要修改。代碼將遞歸遍歷第一個列表,直到它到達第一個列表中的最後一個元素,並將該元素的下一個指針設置爲第二個列表的開始。第二個列表中的元素將由這兩個列表共享。

前:

 
first → a → b → c 

second → d → e → f 

後:

 
first → a → b → c 
       ↓ 
second →  d → e → f