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?
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null || head.next==null) return true;
ListNode n=head;
ListNode mid=getMid(head);//得到中间的那个节点
mid=reverseLinkedList(mid);//反转节点之后的链表
while(n!=null && mid!=null){//判断是不是相等
if(n.val!=mid.val) return false;
n=n.next;
mid=mid.next;
}
return true;
}
public ListNode getMid(ListNode head){
if(head==null || head.next==null) return head;
ListNode mid=head;
ListNode ahead=head;
while(ahead.next!=null && ahead.next.next!=null){//写成while(ahead.next.next!=null && ahead.next!=null)出错,好好好好的体会
ahead=ahead.next.next;
mid=mid.next;
}
return mid;
}
public ListNode reverseLinkedList(ListNode head){
if(head==null || head.next==null) return head;
ListNode pre = head;
ListNode cur = head.next;
pre.next = null;
ListNode nxt = null;
while(cur!=null) {
nxt = cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
}