struct ListNode {
int val;
struct ListNode *next;
explicit ListNode(int v) : val(v) , next(nullptr) {}
};
ListNode* reverseList(ListNode* head) {
if (head == nullptr) return head;
ListNode* p = nullptr;
ListNode* q = head;
ListNode* r = nullptr;
while (q) {
r = q->next;
q->next = p;
p = q;
q = r;
}
return p;
}
bool isPail(ListNode* head) {
if (head == nullptr || head->next == nullptr) return true;
ListNode* slow = head;
ListNode* fast = head;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
}
auto head2 = slow->next;
slow->next = nullptr;
auto new_head = reverseList(head2);
head2->next = slow;
while (head && new_head) {
if (head->val != new_head->val) return false;
head = head->next;
new_head = new_head->next;
}
return true;
}
ListNode* CreateList(vector<int>& vec) {
auto dummy = new ListNode(0);
auto p = dummy;
for (auto v : vec) {
auto node = new ListNode(v);
p->next = node;
p = p->next;
}
return dummy->next;
}
int main() {
vector<int> vec{ 1,2,3,2,1 };
auto head = CreateList(vec);
auto ans = isPail(head);
return 0;
}
bool isPail(ListNode* head) {
if(head == nullptr || head->next == nullptr) return true;
stack<ListNode*> st;
ListNode* slow = head;
ListNode* fast = head;
while(fast && fast->next) {
fast = fast->next->next;
st.emplace(slow);
slow = slow->next;
}
if(fast) st.emplace(slow); // 奇数个
while(!st.empty() && slow) {
auto cur = st.top();
st.pop();
if(cur->val != slow->val) return false;
slow=slow->next;
}
return st.empty();
}