2.7 Implement a function to check if a linked list is a palindrome.
struct ListNode {
int data;
ListNode *next;
ListNode(int x) : data(x), next(NULL) {}
};
Solution #1: Iterative Approach
bool isPalindrome(ListNode *head) {
ListNode *fast = head;
ListNode *slow = head;
stack<int> s;
while (fast && fast->next) {
s.push(slow->data);
slow = slow->next;
fast = fast->next->next;
}
if (fast) {
slow = slow->next;
}
while (!s.empty()) {
if (s.top() != slow->data) {
return false;
}
s.pop();
slow = slow->next;
}
return true;
}
Solution #3: Recursive Approach
bool isPalindromeRecurse(ListNode *head, int length, ListNode **next) {
if (head == NULL || length == 0) {
next = NULL;
return true;
} else if (length == 1) {
*next = head->next;
return true;
} else if (length == 2) {
*next = head->next->next;
return head->data == head->next->data;
}
ListNode *node = NULL;
if (isPalindromeRecurse(head->next, length-2, &node)) {
*next = node->next;
return head->data == node->data;
} else {
return false;
}
}
int listSize(ListNode *head) {
int len = 0;
while (head) {
len++;
head = head->next;
}
return len;
}
bool isPalindrome(ListNode *head) {
ListNode *node = NULL;
return isPalindromeRecurse(head, listSize(head), &node);
}