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?
O(n) time and O(n) space
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) return true;
Stack<Integer> nodes = new Stack<Integer>();
ListNode tmp = head;
while(tmp !=null){
nodes.push(tmp.val);
tmp = tmp.next;
}
while(head != null){
if (head.val != nodes.peek()) return false;
head = head.next;
nodes.pop();
}
return true;
}
O(n) time and O(1) space
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) return true;
ListNode mid = getMid(head);
ListNode head1 = reverseList(mid);
while(head!=null && head1!=null){
if(head.val !=head1.val) return false;
head = head.next;
head1 = head1.next;
}
return true;
}
private ListNode getMid(ListNode head){
ListNode fast, slow;
slow = fast = head;
ListNode preSlow = null;
do{
fast = fast.next;
if(fast!=null){
fast = fast.next;
preSlow = slow;
slow = slow.next;
}
}while(fast!=null);
preSlow.next = null;
return slow;
}
public ListNode reverseList(ListNode head) {
if(head == null ) return null;
if(head.next == null) return head;
ListNode p = head.next;
ListNode q = reverseList(p);
head.next = null;
p.next = head;
return q;
}