2017-10-18 33 views
0

我寫了一個程序,它的工作原理,但我不認爲它應該。有人可以解釋爲什麼它的作品?不完全確定爲什麼我的遞歸鏈表刪除函數的作品?會喜歡一個解釋

我有一個單獨的鏈接列表。這是一個項目,所以我不能發表直接的代碼,但不適改變問題有點

比方說我的鏈表是數字1,2,3,4,4名單,5

我需要掃描列表並刪除任何重複項,所以我需要刪除其中的一個。我需要通過遞歸來完成。

我寫的函數有它的參數/參數作爲指針到列表的開始,我要給這個指針

//Base cases up here 
if (pointer->value == pointer->next->value){ 
    *toDelete = pointer; 
    pointer = pointer->next; 
    delete toDelete; 
    recur the function 
} else recur(pointer->next); 

下面這段代碼工作的,我不認爲它應該是因爲我從來沒有將前一個節點連接到我刪除的節點之後。然而當我看到結果時,所有適當的節點都被連接起來,並且所有應該被移除的節點都被移除。我在這裏誤解了什麼嗎?是否指針=指針 - >下一個不只是點指針地址的下一個節點?

謝謝!

+0

嗨,你能發表完整的代碼嗎?如果您遺漏了某些零件,我們無法確定您做了什麼或不該做什麼。 – Stefan

+0

如果你(*真*)想要一個單鏈表的數據結構,那麼對於$ DEITY的愛,只需使用'std :: forward_list'並完成它。請。請不要重蹈覆轍。更好的是,使用'std :: vector';它可能在現實生活中或多或少總是會更好(不管算法的複雜程度如何等理論性的東西)。 –

+1

@JesperJuhl不幸的是,我必須這樣做,因爲任務規定。不是我的選擇。 – Duxa

回答

0

現在這段代碼可以工作,我不認爲它應該是因爲我從來沒有將前一個節點連接到我刪除的節點之後。

這是正確的。你的功能似乎可以工作,但它確實顯示出未定義行爲的跡象。您需要使用:

if (pointer->next != nullptr && pointer->value == pointer->next->value){ 
    auto toDelete = pointer->next; 
    pointer->next = pointer->next->next; 
    delete toDelete; 

    // Recurse with the same pointer since you might have 4 4 4 
    // in the original list. 
    recur(pointer); 
} 
else {  
    recur(pointer->next); 
} 
+0

是的,謝謝。這就是我正在考慮編寫的內容(加上從列表的開頭和結尾處移除),但我不確定爲什麼我的實現起作用:/ – Duxa

+0

@Duxa,歡迎您。 –

相關問題