问题
思路
回文的思路,借助一个栈保存以下反序序列。
代码
/**
* 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) {
std::stack<int> stk;
ListNode* p = head;
while( p )
{
stk.push(p->val);
p = p-> next;
}
p = head;
while( p )
{
int t = stk.top();
if( t != p->val )
return false;
p = p->next;
stk.pop();
}
return true;
}
};
思路
这题O(N)的办法有,快慢指针。
但是我的代码一直很离奇的过不去,明明都能输出最后返回前的语句。
但是一直过不去。关键我觉得这个问题不可解释。所以先把代码粘过来。
代码
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head || !head->next ) return true;
ListNode* p = head; // fast
ListNode* q = p; // slow
while(q->next && q->next->next){
p = p->next;
q = q->next->next;
}
if(p==q) return p->val == p->next->val;
bool flag = (q->next);
ListNode* mid = p;
ListNode* pre = p;
p = p->next;
while(p){
ListNode* tmp = p->next;
p->next = pre;
pre = p;
p = tmp;
}
if(flag){
while(head != mid->next){
if(head->val != p->val)
return false;
head = head->next;
p = p->next;
}
return true;
}
else{
p = pre;
std::cout << p->val << std::endl;
std::cout << head->val << std::endl;
while(head != mid){
if(head->val != p->val)
return false;
head = head->next;
p = p->next;
}
return true;
}
}
};