Как добиться передачи по ссылке в рекурсивных методах в Java

1

Какими способами мы можем достичь /mock пройти по ссылке в Java? Чтобы проверить, является ли связанный список палиндром, я написал код ниже. Это работает/Но я хотел бы знать, есть ли другие способы достижения этого, не вызывая класс-оболочку.

   class MyClass {
        ListNode mover = head;
        boolean b = true;
    }

public boolean checkPalindrome(){

        ListNode temp = head;

        int len = length()/2 + length()%2;

        MyClass myObj = new MyClass();

        int i =(len%2 == 1) ? len:len-1;

        while(i>1){
            myObj.mover = myObj.mover.next;
            i--;
        }
        boolean e = checkPalindrome(temp, myObj, len);
        return e;
    }

    public boolean checkPalindrome(ListNode head, MyClass ref, int len) {

        if(head == null || len == 0)
            return true;

        len = len-1;

        checkPalindrome(head.next,ref, len);
        ref.mover = ref.mover.next;
        ref.b = ref.b && (head.value==ref.mover.value);
        return ref.b;
    }

Чтобы иметь текущее местоположение объекта ref, я написал оболочку MyClass. Есть ли лучший способ, чем это?

  • 0
    Это не похоже на то, что он будет проверять палиндром вообще - похоже, он проверяет, равна ли первая половина списка второй половине списка. Однако мне кажется, что вам вообще не нужен ваш дополнительный класс - вам просто нужно передать ListNode и использовать возвращаемое значение рекурсивного вызова (который вы в настоящее время игнорируете). Это не поможет тому, что предоставленный вами код даже не скомпилируется - вы используете переменную с именем iterator которой не существует.
  • 0
    Я изменил часть итератора.
Показать ещё 7 комментариев
Теги:
linked-list
recursion
pass-by-reference
inner-classes

3 ответа

1

Вам нужен только дополнительный класс, потому что у вас есть две части информации для поддержки - и у вас есть только две части информации для поддержки, потому что вы игнорируете возвращаемое значение рекурсивного вызова. Я подозреваю, что вы можете изменить свой код для использования AtomicReference:

public boolean checkPalindrome(ListNode head,
                               AtomicReference<ListNode> tailRef,
                               int len) {
    if (head == null || len == 0) {
        return true;
    }

    len--;

    boolean ret = checkPalindrome(head.next, tailRef, len);
    ListNode tail = tailRef.get().next;        
    tailRef.set(tail);
    return ret && head.value == tail.value;
}

Я не проверил его полностью, но если он не совсем там, вы должны быть в состоянии исправить его довольно легко.

1

Классический взлом для выполнения чего-то подобного в Java - это передать аргумент массива одного элемента. Сам массив передается по ссылке, и функция может управлять 1-м элементом. Что-то вроде этого:

myMethod(int arr[], int anotherArg) {
   arr[0] = 123;
}

// Use like this:
int myArr[] = {321}
myMethod(arr, 0)
// myMethod() has "returned" something in arr 1st element. 
0

пример кода ниже:

static LinkedList<String> list = new LinkedList<String>();

public static void main(String[] args) {
    list.add("A");
    list.add("B");
    list.add("C");
    list.add("A");
    boolean result = CheckPalindrome(list.subList(0, list.size()));
    System.out.println("List " + list + "is Palindrome?");
    System.out.println(result);
}

public static boolean CheckPalindrome(List<String> linkedL) {
    if (linkedL.size() <= 1)
        return true;
    if (linkedL.get(0).equals(linkedL.get(linkedL.size() - 1))) {
        return CheckPalindrome(linkedL.subList(1, linkedL.size() - 1));
    } else {
        return false;
    }
}

Ещё вопросы

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