题意
给定一个链表,判断它是不是回文串,要求:
- O(n) 时间
- O(1) 空间
思路
翻转一下链表的前半截,注意一下边界条件和奇偶性。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
int cnt = 0;
ListNode *cur = head;
while (cur != NULL) {
cnt++;
cur = cur->next;
}
if (cnt <= 1) return true;
int mid = cnt / 2;
ListNode *first = head, *second = head, *pre = NULL;
//odd
if (cnt & 1) {
--mid;
while (mid--) {
ListNode *tmp = first->next;
first->next = pre;
pre = first;
first = tmp;
second = tmp;
//first = first->next;
//second = second->next;
}
second = second->next->next;
first->next = pre;
} else {
--mid;
while(mid--) {
ListNode *tmp = first->next;
first->next = pre;
pre = first;
first = tmp;
second = tmp;
//first = first->next;
//second = second->next;
}
second = second->next;
first->next = pre;
}
while (first) {
if (first->val != second->val) return false;
first = first->next;
second = second->next;
}
return true;
}
};