Когда вы находите середину связанного списка в первом цикле while, почему бы вам не сохранить указатель на узел, предшествующий tort:
ListNode prev_tort = head;
while(hare!=null && hare.next!=null) {
//System.out.print("Hare "+ hare.val +"tort "+tort.val);
hare = hare.next.next;
prev_tort = tort;
tort = tort.next;
}
Теперь, когда есть четное количество элементов, заяц будет NULL. Итак, для нечетного случая пропустите средний узел:
if(hare != NULL){
tort = tort.next;
prev_tort = prev_tort.next;
}
tort = reverseLL(tort);
prev_tort.next = tort; // only to ensure list is connected
, а затем приходит ваш код сравнения.
Также в функции reverseLL ():
ListNode rev = reverseLL(nextElem);
head.next.next = head;
head.next = NULL;
return rev;
Если я правильно понимаю, вы пытаетесь проверить, является ли список палиндромом, перевернув вторую половину. В этом случае, для ввода 1-> 2-> 3-> 4, не должен ли деликтный указатель на 4 после изменения второй половины? Это то, что делает приведенный выше код (и список будет: 1-> 2-> 4-> 3).