Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
先翻转后半段,再比较
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null) return true;
//find the mid point
ListNode quickNode = head;
ListNode slowNode = head;
while(quickNode != null){
quickNode = quickNode.next;
if(quickNode != null) quickNode = quickNode.next;
slowNode = slowNode.next;
}
//slowNode is the mid node, reverse the linked list
ListNode pre = slowNode;
ListNode cur = null;
if(pre != null) {cur = pre.next; pre.next = null;}
ListNode next = null;
if(cur != null) next = cur.next;
while(cur != null){
cur.next = pre;
pre = cur;
cur = next;
if(next != null)
next= next.next;
}
while(pre != null){
if(pre.val != head.val) return false;
pre = pre.next;
head = head.next;
}
return true;
}
}