Какими способами мы можем достичь /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. Есть ли лучший способ, чем это?
Вам нужен только дополнительный класс, потому что у вас есть две части информации для поддержки - и у вас есть только две части информации для поддержки, потому что вы игнорируете возвращаемое значение рекурсивного вызова. Я подозреваю, что вы можете изменить свой код для использования 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;
}
Я не проверил его полностью, но если он не совсем там, вы должны быть в состоянии исправить его довольно легко.
Классический взлом для выполнения чего-то подобного в 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.
пример кода ниже:
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;
}
}
ListNode
и использовать возвращаемое значение рекурсивного вызова (который вы в настоящее время игнорируете). Это не поможет тому, что предоставленный вами код даже не скомпилируется - вы используете переменную с именемiterator
которой не существует.