我尝试以递归方式反转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吗?任何帮助都感激不尽。
感谢。
答案 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.next
比first.next.next
更清晰。