C / C ++ в Java Перевод рекурсивно реверсивного связанного списка

0

Я пытаюсь рекурсивно отменить односвязный список на 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? Любая помощь будет высоко ценится.

Благодарю.

Теги:
recursion

2 ответа

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.

  • 0
    Спасибо, Joop, ваше решение сработало отлично. Однако совершенно ли невозможно, чтобы метод просто изменял связи элементов (и, таким образом, переставлял их), не возвращая элемент каждый раз, когда он вызывается? И если да, то имеет ли это отношение к передаче по ссылке (спасибо, Дитер!)? Я думал, потому что у нас есть элементы в памяти, мы могли бы изменить их ссылки, как только у нас будет доступ к ним.
  • 0
    С обратным списком вам нужно вернуть последнюю ссылку, и это можно сделать только после рекурсивного вызова, как выходной параметр или возвращаемое значение. В Java такой выходной параметр может быть сделан как массив из одного элемента: void recursiveReverse(Element<T>[] ref) .
0

Java передается по значению, а код C (а не C++) передается по ссылке (указатель на указатель). Следовательно, две реализации различаются. Посмотрите, есть ли Java "pass-by-reference" или "pass-by-value"?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню