如何在Java中的递归方法中实现pass-by-reference

时间:2014-09-29 05:47:53

标签: java recursion linked-list pass-by-reference inner-classes

我们在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包装器。还有比这更好的方法吗?

3 个答案:

答案 0 :(得分:1)

在Java中执行类似操作的经典hack是传递一个元素的数组参数。数组本身通过引用传递,函数可以操作第一个元素。像这样:

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

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

答案 1 :(得分: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;
}

我还没有彻底检查过,但如果它不是那么那么你应该能够很容易地修复它。

答案 2 :(得分: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;
    }
}