53.回文链表
题目内容:
代码及思路:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head)
{
//如果只有链表为空,或者链表只包含一个元素则一定是回文链表
if (head == nullptr)
return true;
ListNode* fast = nullptr;
ListNode* slow = nullptr;
fast = slow = head;
//判断回文链表的关键在于找到链表的中心位置,当fast指针走到链表最后时,较慢的链表刚好在中心位置
while (fast->next != nullptr&&fast->next->next != nullptr)
{
fast = fast->next->next;
slow = slow->next;
}
//对从中点之后的链表进行翻转,然后将后半部分与前半部分进行比较
slow->next = reverselist(slow->next);
slow = slow->next;
fast = head;
while (slow != nullptr)
{
if (fast->val != slow->val)
return false;
slow = slow->next;
fast = fast->next;
}
return true;
}
ListNode* reverselist(ListNode* head)
{
if (head == nullptr)
return nullptr;
ListNode* newhead = nullptr;
while (head != nullptr)
{
ListNode* temp = head->next;
head->next = newhead;
newhead = head;
head = temp;
}
return newhead;
}
};