题目描述
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
cpp
class Solution {
public:
bool isPalindrome(ListNode* head) {
//快慢指针找到中间结点p1(偶数个结点停在中左)
ListNode* p1 = head;
ListNode* p2 = head->next;
if(p2==nullptr)
return true;
while (p2!=nullptr&&p2->next!= nullptr){
p1=p1->next;
p2=p2->next->next;
}
//后半段头插法逆置
p2=p1->next;
p1->next=nullptr;
while (p2!= nullptr){
ListNode* temp = p2;
p2=p2->next;
temp->next=p1->next;
p1->next=temp;
}
//比较前半段与后半段是否重合
p2=head;
p1=p1->next;
while (p1!= nullptr){
if(p1->val!=p2->val)
return false;
p1=p1->next;
p2=p2->next;
}
return true;
}
};
小结: 这种做法思路比较清晰,而且可以满足O(n) 时间复杂度和 O(1) 空间复杂度