//请判断一个链表是否为回文链表。
//
// 示例 1:
//
// 输入: 1->2
//输出: false
//
// 示例 2:
//
// 输入: 1->2->2->1
//输出: true
//
//
// 进阶:
//你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
// Related Topics 链表 双指针
// 👍 879 👎 0
/*
* 234 回文链表
* 2021-03-04 12:48:36
* @author oxygenbytes
*/
#include "leetcode.h"
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution2 {
public:
bool isPalindrome(ListNode* head) {
if(!head || !head->next) return true;
stack<int> stk;
auto ptr = head;
while(ptr){
stk.push(ptr->val);
ptr = ptr->next;
}
while(head){
if(head->val == stk.top())
head = head->next, stk.pop();
else
return false;
}
return true;
}
};
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head || !head->next) return false;
auto slow = head, fast = head;
while(fast->next && fast->next->next){
slow = slow->next;
fast = fast->next->next;
}
auto last = slow->next , pre = head;
while(last->next){
auto temp = last->next;
last->next = temp->next;
temp->next = slow->next;
slow->next = temp;
}
while(slow->next){
slow = slow->next;
if(pre->val != slow->val) return false;
pre = pre->next;
}
return true;
}
};
//leetcode submit region end(Prohibit modification and deletion)