package com.anuragkapur.ctci.linkedlists;
import com.anuragkapur.ds.linkedlist.LinkedListNode;
/**
* @author anuragkapur
*/
public class Prob2_7_1_Palindrome {
/**
* Checks if list is palindrome by comparing against the reversed list.
*
* Run time complexity: O(n), one iteration to obtain reversed list and one iteration to compare
* Space complexity: O(n)
*
* @param head
* @return
*/
public boolean isPalindrome(LinkedListNode<Integer> head) {
LinkedListNode<Integer> reversedHead = reverseList(head).head;
while (reversedHead != null) {
if (reversedHead.getData() == head.getData()) {
reversedHead = reversedHead.getNext();
head = head.getNext();
} else {
return false;
}
}
if(head != null) {
return false;
}
return true;
}
/**
* Reverses a list using recursion
*
* @param node
* @return
*/
private HeadAndTail reverseList(LinkedListNode<Integer> node) {
if (node.getNext() == null) {
HeadAndTail headAndTail = new HeadAndTail();
headAndTail.head = new LinkedListNode<>(node.getData());
headAndTail.tail = headAndTail.head;
return headAndTail;
} else {
HeadAndTail headAndTail = reverseList(node.getNext());
headAndTail.tail.setNext(new LinkedListNode<>(node.getData()));
headAndTail.tail = headAndTail.tail.getNext();
return headAndTail;
}
}
private class HeadAndTail {
private LinkedListNode<Integer> head;
private LinkedListNode<Integer> tail;
}
}