[LeetCode] 234_回文链表
题目要求
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
题目分析
- 遍历得到链表的长度
- 使用相差一个元素的一前一后的两个指针,最开始时前指针指向头,后指针指向NULL,遍历到链表的一半,遍历的过程中反转链表
- 前指针指向后半部分的头,后指针指向前半部分的头(反转后的头),一一比较,如果有不同那么就不是回文链表
- 如果一直相同,那么是回文链表
注意点
- 空链表和长度只有1的链表是回文链表
- 当链表长度为奇数时,要跳过最终间的链表
代码
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==NULL || head->next==NULL)return true;
int length=0;
ListNode *search=head;
while(search!=NULL){
search=search->next;
++length;
}
ListNode *quick=head;
ListNode *slow=NULL;
for(int i=0;i<length/2;++i){
ListNode*pnext=quick->next;
quick->next=slow;
slow=quick;
quick=pnext;
}
if(length%2==1)quick=quick->next;
while(quick!=NULL && slow!=NULL){
if(quick->val!=slow->val)return false;
quick=quick->next;
slow=slow->next;
}
return true;
}
};