要求:如题,空间O(1)
思路:反转另一半,细节较多,反转要引入临时变量
/**
* 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:
ListNode* reverselist(int count,ListNode* head){
while(count--)head=head->next;
if(head==nullptr||head->next==nullptr)return head;
ListNode *pre=head,*cur=head->next,*tmp;
while(cur){
tmp=cur;
cur=cur->next;
tmp->next=pre;
pre=tmp;
}
head->next=nullptr;
return pre;
}
bool isPalindrome(ListNode* head) {
ListNode *p=head;
int count=0;
while(p){
p=p->next;
++count;
}
ListNode *head2;
if(count&1)head2=reverselist(count/2+1,head);
else head2=reverselist(count/2,head);
while(head2){
if(head->val!=head2->val)return false;
head=head->next;head2=head2->next;
}
return true;
}
};