题目如下:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
例子如下:
输入:1->2->2->1
返回:true
思路解析:
1、寻找到到链表的中点,然后利用指针去改变里面存储的地址最后利用在最后的指针和一个在最前面的指针相比较就行了。
代码展示:
struct ListNode* detectCycle(struct ListNode* head)
{
struct ListNode* cur = head;
struct ListNode* fast = head;
struct ListNode* slow = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
struct ListNode* next = NULL;
while (slow)
{
cur = slow->next;
slow->next = next;
next = slow;
slow = cur;
}
cur = head;
while (cur && next)
{
if (cur->val != next->val)
return false;
cur = cur->next;
next = next->next;
}
return true;
}