题目描述
请判断一个链表是否为回文链表。
示例1
输入: 1->2 输出: false
示例2
输入: 1->2->2->1 输出: true
思路
其一,find mid node 使用快慢指针找到链表中点。 其二,reverse 逆序后半部分。 其三,check 从头、中点,开始比较是否相同。
实现
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
bool isPalindrome(ListNode* head) {
ListNode* slow, *fast, *prev = nullptr;
slow = head;
fast = head;
while(fast) {
slow = slow->next;
fast = fast->next ? fast->next->next : fast->next;
}
while (slow)
{
ListNode* ne = slow->next;
slow->next = prev;
prev = slow;
slow = ne;
}
while (head && prev) {
if (head->val != prev->val)
{
return false;
}
head = head->next;
prev = prev->next;
}
return true;
}