请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解决思路:先利用快慢指针找出中间结点,然后反转链表后半部分,再将反转后的后半链表与前半链表逐一比较。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head){
if (!head || !head->next) //空链表和只有一个结点的链表都算回文链表
return true;
struct ListNode *slow = head;
struct ListNode *fast = head;
struct ListNode *p = NULL;
struct ListNode *q = NULL;
struct ListNode *reverse_head = NULL;
while (fast->next && fast->next->next) //利用快慢指针找出中间结点
{
slow = slow->next;
fast = fast->next->next;
}
p = slow;
q = slow;
reverse_head = slow;
while (q->next) //反转链表后半部分
{
p = q->next;
q->next = q->next->next;
p->next = reverse_head;
reverse_head = p;
p = q->next;
}
fast = head;
while (fast && reverse_head && reverse_head != slow) //将反转后的后半链表与前半链表逐一比较
{
if (fast->val == reverse_head->val)
{
fast = fast->next;
reverse_head = reverse_head->next;
}
else
return false;
}
return true;
}