题目:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
思路:
① 找到中间结点
② 取出并反转后半截
③ 对比
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//找到中间节点
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* fast = head;
struct ListNode* slow = head;
while (fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
//翻转以中间节点为头节点的链表
struct ListNode* reverseList(struct ListNode* head)
{
if (head == NULL)
return NULL;
struct ListNode* cur = head;
struct ListNode* next = cur->next;
struct ListNode* newhead = NULL;
while (cur != NULL)
{
//头插
cur->next = newhead;
newhead = cur;
//迭代后移
cur = next;
if (next != NULL)
{
next = next->next;
}
}
return newhead;
}
bool isPalindrome(struct ListNode* head){
struct ListNode* mid = middleNode(head);
struct ListNode* newhead = reverseList(mid);
struct ListNode* curFirst = head;
struct ListNode* curSecond = newhead;
while (curFirst && curSecond)
{
if (curFirst->val != curSecond->val)
{
return false;
}
else
{
curFirst = curFirst->next;
curSecond = curSecond->next;
}
}
return true;
}