此题为回文链表判定
由于题目限制时间复杂度为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) {
if(head==nullptr)
return true;
ListNode * pnode=head;
int num=0;
while(pnode!=nullptr)
{
num++;
pnode=pnode->next;
}
//将后半部分链表反转
ListNode * front=nullptr;
ListNode * back=nullptr;
pnode=head;
for(int i=0;i<num/2;i++)
{
pnode=pnode->next;
}
front=nullptr;
back=pnode;
while(back!=nullptr)
{
pnode=back->next;
back->next=front;
front=back;
back=pnode;
}
//比较是否相等
pnode=head;
for(int i=0;i<num/2;i++)
{
if(pnode->val==front->val)
{
pnode=pnode->next;
front=front->next;
}
else
return false;
}
return true;
}
};