我们在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 :(得分: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;
}
}