bool isPalindrome(struct ListNode* head){
//排除特殊情况
if(head == NULL||head->next==NULL)
return true ;
if(head->next->next==NULL)
{
if(head->val==head->next->val)
return true ;
else
return false ;
}
//定义快慢双指针,当快指针移动完毕时,慢指针刚好指向链表中间
struct ListNode* slowp=head->next ;//每次移动一格
struct ListNode* fastp=head->next->next ;//每次移动两格
while(fastp!=NULL && fastp->next!=NULL)
{
slowp=slowp->next ;
fastp=fastp->next->next;
}
//然后看可以翻转中部之前的链表,以便于后续比较
struct ListNode* prev =NULL ;
struct ListNode* Temp =NULL ;
struct ListNode* curr =head;
//翻转
while(curr!=slowp)
{
Temp =curr->next ;
curr->next =prev ;
prev = curr ;
curr = Temp ;
}
//奇数个的时候不需要对比中间的slow所以后移一格
if(fastp !=NULL && fastp->next==NULL)
{
slowp=slowp->next ;
}
//回文匹配
while(prev!=NULL)
{
if(prev->val != slowp->val)
return false ;
prev=prev->next;
slowp=slowp->next;
}
return true;
}