题目:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
方法:
1、找到中间结点(使用快慢指针)
![](https://img-blog.csdnimg.cn/direct/f62902996539413aad5df50c38eecc7e.png)
![](https://img-blog.csdnimg.cn/direct/ceda6797beef44b89f5add815061a303.png)
2、逆置中间结点及其后面的结点
![](https://img-blog.csdnimg.cn/direct/0011b55acaad47bfbd25f14c925fe8de.png)
![](https://img-blog.csdnimg.cn/direct/a5913dd7d7b44a8f8b12f11dfbf57915.png)
具体代码实现如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
typedef struct ListNode ListNode;
class PalindromeList {
public:
struct ListNode* reverselist(struct ListNode* head)
{
//处理空链表
if(head == NULL)
{
return head;
}
//创建三个指针,分别记录前驱结点,当前结点,后继结点,改变原链表指针指向
ListNode* n1,*n2,*n3;
n1 = NULL,n2 = head,n3 = head->next;
//遍历原链表,修改结点指针的指向
ListNode* pcur = head;
while(n2)
{
//修改n2的指向
n2->next = n1;
//修改三个指针的位置
n1 = n2;
n2 = n3;
if(n3)
{
n3 = n3->next;
}
}
return n1;
}
struct ListNode* middleNode(struct ListNode*head)
{
ListNode* slow = head,*fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
bool chkPalindrome(ListNode* A) {
ListNode* mid = middleNode(A);
ListNode* rmid = reverselist(mid);
while(A && rmid)
{
if(A->val != rmid->val)
{
return false;
}
A = A->next;
rmid = rmid->next;
}
return true;
}
};
感谢观看,如有疑惑,我会尽力解答!