题解 | 链表的回文结构
链表的回文结构
https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };*/ class PalindromeList { public: //反转链表 ListNode* reverseList(ListNode* head) { //创建一个新链表,将原链表中的每一个结点通过头插加到新链表 ListNode* newHead = nullptr; ListNode* pcur = head; while (pcur != nullptr) { ListNode* next = pcur->next; pcur->next = newHead; newHead = pcur; pcur = next; } return newHead; } bool chkPalindrome(ListNode* A) { if (A == nullptr || A->next == nullptr) { return true; } //1.找中间结点 ListNode* fast = A; ListNode* slow = A; while (fast != nullptr && fast->next != nullptr) { slow = slow->next; fast = fast->next->next; } ListNode* mid = slow; //2.反转后半段链表 ListNode* revertseHead = reverseList(mid); //3.比较前半段和反转后的后半段 ListNode* p1 = A; ListNode* p2 = revertseHead; bool res = true; while (res && p2 != nullptr) { if (p1->val != p2->val) { res = false; } p1 = p1->next; p2 = p2->next; } //4.恢复原链表的顺序 slow->next = reverseList(revertseHead); return res; } };