思路:先找到链表的中间节点,如果有两个节点的话应该是第二个节点为中间节点,然后将后半部分链表进行反转,最后再与前一部分链表进行比较,如果相同,则为回文链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* fast=head;
ListNode* slow=head;
while((fast!=nullptr)&&(fast->next!=nullptr))
{
fast=fast->next->next;
slow=slow->next;
}
ListNode* F=nullptr;
ListNode* mid=slow;
ListNode* L=nullptr;
while(mid!=nullptr)
{
L=mid->next;
mid->next=F;
F=mid;
mid=L;
}
while(F&&head)
{
if(F->val!=head->val)
{
return false;
}
F=F->next;
head=head->next;
}
return true;
}
};