给定一个链表,请判断该链表是否为回文结构。
示例1
输入
复制
[1,2,2,1]
返回值
复制
true
备注:
1 \leq n \leq 10^61≤n≤10
这道题在力扣就没做出来,还是因为太懒,不愿意去思考,感觉用容器存一下算了,显然这道题不是这么做的,另一方面是陷入了一个误区,总认为做题是不能改变链表的原来的形状的,单这道题想在常数复杂度下做出来,,显然只能改变链表的链接,用快慢指针找到中间点,在slow指针去中间点的路上,将链表反转,然后就可以从中间点来比较值是否相等了,这道题算是快慢指针和链表反转的综合运用吧,也是非常有意思的
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(ListNode* head) {
//让一个指针走到中间 让慢指针将前面的链表反转 然后依次比较值是否相等
//1->2->2->1 1<-2 2->1;
// 1->2->3->2->1
ListNode* slow=head,*fast=head;
ListNode* pre=NULL;
while(fast&&fast->next){
fast=fast->next->next;
ListNode *l=slow->next;
slow->next=pre;
pre=slow;
slow=l;
}
if(fast!=NULL) slow=slow->next;
while(pre){
if(pre->val!=slow->val)
return false;
pre=pre->next;
slow=slow->next;
}
return true;;
}
};