没啥难度的一道题,关键是处理好长度奇数偶数的问题、以及快慢指针要准确切一半的初始化、结束判断。
栈先把值放进去,比较方便,【1,2】这样的链表,如果是在循环里面放,就进不了循环没放进去栈里。
快慢指针先初始为1和2,然后判断next是否为空来判断是否最后一个。
长度奇数的值不用放进去栈,及时break。当前fast指针前进完两个,就是当前长度是偶数的时候,才push进栈里。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==NULL)//空
return true;
ListNode* slow=head;
ListNode* fast=head->next;
if(fast==NULL)//单个
return true;
stack<int> s;
s.push(slow->val);//先放进去
while(fast->next){//是否最后一个
slow=slow->next;
fast=fast->next;
if(fast->next==NULL){//长度奇数
break;
}
fast=fast->next;
s.push(slow->val);
}
ListNode* p=slow->next;
while(p){
if(p->val!=s.top())
return false;
s.pop();
p=p->next;
}
return true;
}
};