C / C ++到Java的递归反转链表的翻译

时间:2014-02-20 18:38:16

标签: java c++ c recursion

我尝试以递归方式反转Java中的单链表,并从斯坦福的代码中学习。有人可以帮我翻译C / C ++代码到java,这样我的recursiveReverse()仍然是一个void方法吗?

以下是斯坦福的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;

}

我最初使用&#34; currElement = rest&#34;作为最后一行但是当我开始使用1,2,3,null时,我得到的输出是1,null

但是在使用head = rest(链接列表的原始头部)后,我现在有2,1,null。

有人可以帮我翻译一下,这样我就可以得到输出为3,2,1,null吗?任何帮助都感激不尽。

感谢。

2 个答案:

答案 0 :(得分:0)

Java通过值传递,C代码(不是C ++)通过引用传递(指向指针的指针)。因此,两种实现方式不同。请查看Is Java "pass-by-reference" or "pass-by-value"?

答案 1 :(得分: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更清晰。