Я пытаюсь рекурсивно отменить односвязный список на Java, и я узнал из этого кода из Стэнфорда. Может кто-нибудь, пожалуйста, помогите мне перевести код C/C++ в java, чтобы мой рекурсивныйReverse() по-прежнему был недействительным?
Здесь решение 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 = rest" в качестве последней строки, но с этим, когда я начал с 1,2,3, null, результат, который я получил, был равен 1, null
Но после использования head = rest (исходный заголовок связанного списка) у меня теперь есть 2,1, null.
Может кто-то, пожалуйста, помогите мне перевести его правильно, чтобы я мог получить результат как 3,2,1, null? Любая помощь будет высоко ценится.
Благодарю.
Тонкости 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
.
Java передается по значению, а код C (а не C++) передается по ссылке (указатель на указатель). Следовательно, две реализации различаются. Посмотрите, есть ли Java "pass-by-reference" или "pass-by-value"?
void recursiveReverse(Element<T>[] ref)
.