给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
链表中节点数目在范围[1, 105] 内
0 <= Node.val <= 9
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
本题我的思路是用快慢指针,找到链表的中间位置,然后翻转后半部分的链表,前后两个链表进行对比,得出结果。(反转链表之后最好再反转回去,从而避免改动输入链表…这里偷个懒,没有反转回去<-_->)。
class Solution {
private:
ListNode* reverseList(ListNode* head){
ListNode* curr = head;
ListNode* pre = nullptr;
while(curr){
ListNode* next = curr->next;
curr->next = pre;
pre = curr;
curr = next;
}
return pre;
}
public:
bool isPalindrome(ListNode* head) {
if(head==nullptr)
return false;
ListNode* slow = head;
ListNode* fast = head;
while(fast->next!=nullptr&&fast->next->next!=nullptr)
{
slow=slow->next;
fast=fast->next->next;
}
ListNode* head2 = reverseList(slow->next);
fast = head2;
slow = head;
while(fast)
{
if(fast->val!=slow->val)
{
return false;
}
fast=fast->next;
slow=slow->next;
}
return true;
}
};