题目:
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2 Output: false
Example 2:
Input: 1->2->2->1 Output: true
Follow up:
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:
bool isPalindrome(ListNode* head) {
if (!head||!head->next)return true;
ListNode* slow = head, * fast = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* h = slow->next;
while (h->next) {
ListNode* q = h->next;
h->next = q->next;
q->next = slow->next;
slow->next = q;
}
h = slow->next; slow = head;
while (h && slow) {
if (slow->val != h->val)return false;
slow = slow->next; h = h->next;
}
return true;
}
};
做法:
先采用双指针法找到链表中点,再对中点以后的链表进行逆序,最后比较两段的元素是否一致,如果一致,是回文串,否则,不是回文串。