题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
分析
判断一个链表是否为回文链表,首先需要找到中点,然后进行对比。于是,采用快慢指针找到中点。在找中点的时候,我们采用慢指针,边遍历边反转。当我们找到中点的时候,也就得到了反转成功的半个链表,然后依次遍历比较就可以。链表元素有偶数和奇数的区别,如果快慢指针找到中点之后,快指针不是空指针,那么表示节点有奇数个。
bool isPalindrome(ListNode* head) {
if(head==NULL||head->next==NULL)
return true;
if(head->next->next==NULL&&head->val!=head->next->val)
return false;
//找中间节点 边走边反转
//链表长度为奇数和偶数情况不一样 需要判断是奇数还是偶数
ListNode* slow=head;
ListNode* pre=NULL;
ListNode* fast=head;
while(fast!=NULL&&fast->next!=NULL)
{
fast=fast->next->next;
ListNode *pnext=slow->next;
slow->next=pre;
pre=slow;
slow=pnext;
}
if(fast!=NULL)//说明是奇数 fast->next==NULL
{
slow=slow->next;
}
while(pre!=NULL&&slow!=NULL)
{
if(slow->val!=pre->val)
return false;
else
{
pre=pre->next;
slow=slow->next;
}
}
return true;
}