题目描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
c++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
/*
思路:1.快慢指针找中间节点
2.翻转后半截链表
3.遍历前后两个链表观察是否对应相同
*/
public:
bool isPalindrome(ListNode* head) {
//特殊情况
if(!head->next) return true;
if(!head->next->next) return head->val==head->next->val;
//1.快慢指针找链表中点
ListNode* fast=head->next;
ListNode* slow=head;
while(fast && fast->next){
fast=fast->next->next;
slow=slow->next;
}
//此时slow->next指针指向中间节点
ListNode * head2=slow->next;
//2. 翻转后半截链表
ListNode* pre=nullptr;
ListNode* next=head2->next;
while(next){
head2->next=pre;
pre=head2;
head2=next;
next=next->next;
}
head2->next=pre;
//3.比较head和head2打头的两个链表是否相同
ListNode* cur1=head;
ListNode* cur2=head2;
while(cur2){
if(cur1->val!=cur2->val)
{
return false;
}
cur1=cur1->next;
cur2=cur2->next;
}
return true;
}
};
本文解析如何使用O(n)时间复杂度和O(1)空间复杂度的算法判断链表是否为回文。通过快慢指针找到链表中点并翻转后半部分,逐个比较首尾节点,实现高效的链表回文检查。

被折叠的 条评论
为什么被折叠?



