一道简单的链表题,判断链表是否是回文链表
一般的思路是用数组vector记录各个节点上的值,然后判断是否是回文的。但需要消耗O(n)的复杂度,这里记录空间复杂度为O(1)的一种方法
核心思想是将链表平分成两段,后半段翻转,然后比较这两串链表是否相同,主要需要解决三个问题
如何反转:
ListNode* reverseList(ListNode* head)
{
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur != nullptr){
ListNode* node = cur->next;
cur->next = pre;
pre = cur;
cur = node;
}
return pre;
}
如何拆分指针:
使用快慢指针,slow一次前进1,fast一次前进2,当fast走到头,slow所在的位置就是链表的中间
ListNode* findhalf(ListNode* head)
{
ListNode* slow = head;
ListNode* fast = head;
while(fast->next != nullptr && fast->next->next != nullptr){
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
如何判断:
如果将反转链表与前半段比较,边界不好判断容易越界,所以直接和原head比较
ListNode* qian = findhalf(head);
ListNode* hou = reverseList(qian->next);
ListNode* cur_q = head;
ListNode* cur_h = hou;
while(cur_h != nullptr){
if(cur_q->val != cur_h->val) return false;
cur_h = cur_h->next;
cur_q = cur_q->next;
}
return true;