2014-02-20 100 views
0

我想在Java中遞歸地反轉單向鏈表,並從斯坦福大學的這段代碼中學到了東西。有人可以幫我把C/C++代碼翻譯成java,這樣我的recursiveReverse()仍然是一個無效的方法嗎?C/C++到Java遞歸反轉鏈接列表的翻譯

下面是來自斯坦福大學的C/C++的解決方案:

void RecursiveReverse(struct node** headRef) { 
    struct node* first; 
    struct node* rest; 

    if (*headRef == NULL) return; 

    first = *headRef; 
    rest = first->next; 

    if (rest == NULL) return; 

    RecursiveReverse(&rest); 

    first->next->next = first; 
    first->next = NULL; 
    *headRef = rest; 
} 

這裏是我的代碼轉換的嘗試:

public void recursiveReverse(Element<T> currElement) { 
    Element<T> first; 
    Element<T> rest; 

    if (currElement == null) return; 

    first = currElement; 
    rest = currElement.next; 

    if (rest == null) return; 

    recursiveReverse(rest); 

    first.next.next = first; 
    first.next = null; 
    head = rest; 

}

我最初使用 「currElement =休息」 爲最後一行,但與此,當我開始1,2,3,空,我得到的輸出是1,空

但是在使用head = rest(鏈表的原始頭)後,我現在有2,1,null。

有人可以幫助我正確地翻譯它,所以我可以得到輸出爲3,2,1,null?任何幫助都感激不盡。

謝謝。

回答

0

C++的精妙之處在於別名,改變了傳遞的變量。這裏使用函數結果可以達到相同的效果。

public Element<T> recursiveReverse(Element<T> currElement) { 
    if (currElement == null) return null; 

    Element<T> rest = currElement.next; 

    if (rest == null) return currElement; 

    Element<T> reversed = recursiveReverse(rest); 

    rest.next = currElement; 
    currElement.next = null; 
    return reversed; 
} 

在java中,通常會在第一次使用時聲明。我發現rest.nextfirst.next.next更清晰。

+0

謝謝Joop,你的解決方案工作完美。但是,如果在每次調用元素時都不改變元素的鏈接(並重新排列它們)而不返回元素,那麼完全不可能實現這種方法嗎?如果是這樣,它是否與傳遞參考(謝謝,Dieter!)有關?我在想,因爲我們有記憶中的元素,我們可以在訪問它們後改變它們的鏈接。 – Stralo

+0

對於反向列表,您需要返回最後一個鏈接,並且只能在遞歸調用之後完成,作爲出參數或返回值。在java中,這樣一個out參數可以作爲一個元素的數組:'void recursiveReverse(Element [] ref)'。 –