Implement a function to check if a linked list is a palindrome.
Example
Given 1->2->1
, return true
Challenge
Could you do it in O(n) time and O(1) space?
找到中间点, 然后开始检查:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param head a ListNode
* @return a boolean
*/
bool isPalindrome(ListNode* head) {
// Write your code here
if (head == NULL || head->next == NULL)
return true;
int len = 0;
ListNode* node = head;
while (node != NULL) {
len++;
node = node->next;
}
int half_len = 0;
int first_end = 0;
if (len % 2 == 0) {
half_len = len / 2 + 1;
first_end = len / 2;
} else {
half_len = len / 2 + 2;
first_end = len / 2;
}
ListNode* half_start = head;
int i = 1;
while (i != half_len) {
half_start = half_start->next;
i++;
}
node = head;
stack<int> stk;
for (int i = 1; i <= first_end; i++) {
stk.push(node->val);
node = node->next;
}
while (half_start != NULL) {
if (half_start-> val != stk.top()){
return false;
} else {
stk.pop();
half_start = half_start->next;
}
}
return true;
}
};