题解 | #判断一个链表是否为回文结构#
判断一个链表是否为回文结构
https://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ #include <bits/types/stack_t.h> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 the head * @return bool布尔型 */ // 虽然能过,但是我自己感觉怪怪的,不知道哪里不对劲,这个还是别看了 // bool isPail(ListNode* head) { // if(head->next==nullptr) return true; // ListNode* slow = head; // ListNode* fast = head; // stack<int> st; // while (fast && fast->next) { // st.push(slow->val); // slow = slow->next; // fast = fast->next->next; // } // cout<<"st.top() : "<< st.top() << " slow->val"<< slow->val<<endl; // while(slow && !st.empty()) { // if(st.top() == slow->val) { // st.pop(); // } // slow=slow->next; // } // if(st.empty()) { // return true; // } // return false; // } // 方式一 //1.用快慢指针找到中点,然后借助判断回文,这里需要注意链表长度为奇数的时候,此时慢指针指向链表的中间节点,需要再向前走一步 // bool isPail(ListNode* head) { // ListNode* slow = head; // ListNode* fast = head; // stack<int> st; // // while (fast->next && fast->next->next) { // while(fast && fast->next) { // st.push(slow->val); // slow = slow->next; // fast = fast->next->next; // } // if(fast){ //链表长度为奇数的时候,慢指针需要多走一步,即走过中间节点 // slow = slow->next; // } // while (slow) { // if(st.top() != slow->val){ // return false; // } // slow = slow->next; // st.pop(); // } // if(st.empty()){ // return true; // } // else{ // return false; // } // } // 方式二 bool isPail(ListNode* head) { ListNode* slow = head; ListNode* fast = head; ListNode* pre = nullptr; while (fast && fast->next) { fast = fast->next->next; // slow = slow->next 就在这四句代码中实现了,同时实现了反转前半部分链表 ListNode* next = slow->next; slow->next = pre; pre = slow; slow = next; } if (fast) slow = slow->next; while (slow) { if (pre == nullptr || pre->val != slow->val) { return false; } pre = pre->next; slow = slow->next; } return true; } };