欧买噶,鸡冻,第一次自己写出比较难的虽然只是easy通过了,而且就是空间O(1)。用了前面学的快慢指针找中间结点,翻转链表,比较两个链表。注意找的中间结点是n/2向下取整,然后翻转n/2向上取整处的链表。n为奇数时,l1会多一个结点,此时整个链表也是回文,返回true。
/**
* 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 *fast=head, *slow=head; //找到中间结点,或靠前的中间结点
while(fast && fast->next && fast->next->next){
slow=slow->next;
fast=fast->next->next;
}
ListNode *l1=head, *l2=Reverse(slow->next); //建立两条链表,开始比较
slow->next=NULL;
ListNode *p=l1, *q=l2;
while(p && q){
if(p->val != q->val) return false;
p=p->next;
q=q->next;
}
if(!p) return true; //总数为偶数
if(!p->next) return true; //总数为奇数
else return false;
}
ListNode* Reverse(ListNode* p){
ListNode *pre=NULL, *cur=p, *next=NULL;
while(p){
next=p->next;
p->next=pre;
pre=p;
p=next;
}
return pre;
}
};