OR36 链表的回文结构
较难 通过率:30.09% 时间限制:3秒 空间限制:32M
描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true思路:
- 根据回文对称的特点,先找到中间节点,可以运用快慢指针的方法找到中间节点。
- 然后将中间结点后面的结点逆置
- 比较,若相同返回true,不同返回false(注意:这里是用pre来和A比,详细的可以看下面的图思考)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
ListNode* fast = A;
ListNode* slow = A;
//先找到中间节点
while(fast != nullptr && fast->next != nullptr)
{
fast = fast->next->next;
slow = slow->next;
}
//然后将中间结点后面的结点逆置
ListNode* prev = nullptr;
while(slow != nullptr)
{
ListNode* next = slow->next;
slow->next = prev;
prev = slow;
slow = next;
}
//比较,若相同返回true,不同返回false
//注意:这里是用pre来和A比,详细的可以自己画图体会
while(prev != nullptr && A!= nullptr)
{
if(prev->val != A->val)
{
return false;
}
else
{
prev = prev->next;
A = A->next;
}
}
return true;
}