题目描述
思路分析
链表模拟题
先把后半段链表反转,再一一对照得到答案,最后复原链表。
代码实现
/**
* 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) {
auto k=head;
int n=0;
while(k) k=k->next,n++;
if(n<=1) return true;
auto a=head;
for(int i=0;i<n-n/2;i++) a=a->next;
auto b=a->next;
for(int i=0;i<n/2-1;i++){
auto c=b->next;
b->next=a;
a=b;
b=c;
}
auto p=head,q=a;
bool flag=true;
for(int i=0;i<n/2;i++){
if(p->val!=q->val){
flag=false;
break;
}
p=p->next;
q=q->next;
}
auto tail=a;
b=a->next;
for (int i = 0; i < n/2 - 1; i ++ ) {
auto c = b->next;
b->next = a;
a = b, b = c;
}
tail->next=NULL;
return flag;
}
};