1.首先计算出后半部分链表的长度 half = n / 2
2.移动到链表的中间位置 n-half
3.翻转后半部分链表 a = b,b = c
4.判断是否为回文串
5.将链表再翻转回来
6.记得要将结尾节点的next置为nullptr
class Solution {
public:
bool isPalindrome(ListNode* head) {
int n = 0;
ListNode* p = head;
while(p){
p = p->next;
n++;
}
if(n <= 1) return true;
int half = n / 2; //找到中点
ListNode* a = head;
for(int i = 0; i < n - half; ++i) a = a->next;
ListNode* b = a->next;
for(int i = 0; i < half - 1; ++i){
auto c = b->next;
b->next = a;
a = b,b = c;
}
ListNode* p1 = head;
ListNode* q1 = a;
bool flag = true;
for(int i = 0; i < half; ++i){
if(p1->val != q1->val){
flag = false;
break;
}
p1=p1->next, q1=q1->next;
}
auto tail = a;
//再把链表转回去
b = a->next;
for(int i = 0; i < half - 1; ++i){
auto c = b->next;
b->next = a;
a = b,b = c;
}
tail->next = nullptr; //注意结尾要置0
return flag;
}
};