1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
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 Solution { public: bool isPalindrome(ListNode *head) { if (head == nullptr) return false; if (head->next == nullptr) return true;
ListNode *low = head, *fast = head, *left, *right; int cnt = 1; while (fast->next != nullptr) { if (low->next) low = low->next;
if (fast->next) { fast = fast->next; cnt++; }
if (fast->next) { fast = fast->next; cnt++; } }
ListNode *prev = head, *p = head->next; ListNode *next; while (p && p != low) { next = p->next; p->next = prev; prev = p; p = next; } head->next = nullptr;
left = prev;
if (cnt % 2 == 0) right = low; else right = low->next;
while (left && right && left->val == right->val) { left = left->next; right = right->next; }
if (left == nullptr && right == nullptr) return true;
return false; } };
#include <vector> using std::vector;
int main() { vector<int> vec = { 1, 2, 3, 4 }; ListNode *head = nullptr, *tail = nullptr; for (int val : vec) { if (head == nullptr && tail == nullptr) { head = tail = new ListNode(val); } else { tail->next = new ListNode(val); tail = tail->next; } } Solution S; S.isPalindrome(head); }
|