234. 回文链表
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1] 输出:true
示例 2:
输入:head = [1,2] 输出:false
提示:
- 链表中节点数目在范围
[1, 105]
内 0 <= Node.val <= 9
进阶:你能否用 O(n)
时间复杂度和 O(1)
空间复杂度解决此题?
思路:利用快慢指针--找到中间节点,将中间节点后的节点翻转,返回翻转后的头指针,在通过原链表头指针和翻转的头指针进行遍历,如果存在不同就不是回文链表,直到新链表节点指向空
代码实现:
bool isPalindrome(SListNode* phead) {
if(phead == NULL || phead->next == NULL){
return true;
}
//利用快慢指针,找到中间节点!
SListNode* slow = phead;
SListNode* fast = phead;
while (fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next->next;
}
//slow此时为左中间节点,指向右中间节点
//将后面节点进行反转
SListNode* prev = NULL;
SListNode* cur = slow->next;
while (cur)
{
SListNode* Next = cur->next;
cur->next = prev;
prev = cur;
cur = Next;
}
SListNode* p1 = prev;
SListNode* p2 = phead;
while (p1)
{
if(p1->data != p2->data){
return false;
}
p1 = p1->next;
p2 = p2->next;
}
return true;
}
这里用到了:利用快慢指针寻找遍历链表寻找指定节点的思想Leetcode刷题营第十题:删除链表的倒数第 n 个结点,Leetcode刷题营第九题:链表的中间节点
以及:三个指针反转链表的思想:Leetcode刷题营第八题:反转链表。
这些都是链表题中常用的解题思想,希望大家能熟练运用。
谢谢大家的点赞和收藏👍