链表的回文结构
一、题目
📚描述
对于一个链表,请设计一个时间复杂度为O(n)
,额外空间复杂度为O(1)
的算法,判断其是否为回文结构。
给定一个链表的头指针A
,请返回一个bool
值,代表其是否为回文结构。保证链表长度小于等于900
📚测试样例:
1->2->2->1
返回:true
二、思路分析
📕📕我们需要找到中间的数的地址
📌存在两种情况:
- 🔖偶数个节点
- 🔖奇数个节点
🎃🎃fast->next = NULL 或 fast = NULL 结束循环
🎃🎃
🎐找到中间点之后,翻转之后的节点链接
🌿🌿可以参考之前的文章:【LeetCode·单链表.206】反转链表🌿🌿
翻转链表至下图样子
- 🌸奇数比较:
- 🌸偶数比较:
💐💐方块是比较顺序
💐💐
🌻代码如下🌻
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
ListNode* slow = A;
ListNode* fast = A;
while(fast->next && fast)
{
fast = fast->next->next;
slow = slow->next;
}
ListNode* cur = slow;
ListNode* tail = NULL;
ListNode* newnode = NULL;
while(cur)
{
newnode = cur;
cur = cur->next;
newnode->next = tail;
tail = newnode;
}
ListNode* curA = A;
ListNode* curR = newnode;
while(curA && curR)
{
if(curA->val != curR->val)
{
return false;
}
curA = curA->next;
curR = curR->next;
}
return true;
}
};