给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
解题思路:
快慢指针
将链表的后半部分反转(修改链表结构),然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。
整个流程可以分为以下五个步骤:
1. 找到前半部分链表的尾节点。
2. 反转后半部分链表。
3. 判断是否回文。
4. 恢复链表。
5. 返回结果。
代码如下:
//链表反转 struct ListNode* reverseList(struct ListNode* head) { struct ListNode* prev = NULL; struct ListNode* curr = head; while (curr != NULL) { struct ListNode* nextTemp = curr->next; curr->next = prev; prev = curr; curr = nextTemp; } return prev; } struct ListNode* endOfFirstHalf(struct ListNode* head) { struct ListNode* fast = head; struct ListNode* slow = head; while (fast->next != NULL && fast->next->next != NULL) { fast = fast->next->next; slow = slow->next; } return slow; } bool isPalindrome(struct ListNode* head) { if (head == NULL) { return true; } // 找到前半部分链表的尾节点并反转后半部分链表 struct ListNode* firstHalfEnd = endOfFirstHalf(head); struct ListNode* secondHalfStart = reverseList(firstHalfEnd->next); // 判断是否回文 struct ListNode* p1 = head; struct ListNode* p2 = secondHalfStart; bool result = true; while (result && p2 != NULL) { if (p1->val != p2->val) { result = false; } p1 = p1->next; p2 = p2->next; } // 还原链表并返回结果 firstHalfEnd->next = reverseList(secondHalfStart); return result; }
始终觉得递归算法对我来说就是脑壳疼。。。。。。。。。。。。。