题目来源:
https://leetcode-cn.com/problems/palindrome-linked-list/description/
描述:
请判断一个链表是否为回文链表。
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
示例:
输入: 1->2->2->1
输出: true
思路:
思路:如何判断回文,从中间位置开始向两边不断判断相等并移动。
关键点一:如何找到链表中间位置。
采用两个指针,指针p移动两格,指针mid移动一格,当p移动终点时,指针mid所在为中间位置
关键点二:找到了中间点,如何判断回文呢?
根据判断回文思路,如果1->2->3->4->3->2->1 能够变成 1<-2<-3-<4->3->2->1就好了。 结合关键点一和链表逆转的方式,在mid移动时同时逆转就好了。
代码:
思路:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (NULL == head ) return true;
ListNode *mid = head;
ListNode *pre = NULL;
ListNode *p = head;
ListNode *bak;
//将链表前半部分逆置方向
while (p && p->next) {
p = p->next->next;
bak = mid;
mid = mid->next;
bak->next = pre;
pre = bak;
}
if (p != NULL) //奇数个元素
mid = mid->next;
//从链表中间位置分别向两边一次比较元素判断回文链表
while (mid && pre) {
if (mid->val != pre->val) return false;
mid = mid->next;
pre = pre->next;
}
return true;
}
};
本文介绍了一种使用O(n)时间复杂度和O(1)空间复杂度来判断链表是否为回文的方法。通过双指针技巧找到链表中点,并通过逆转前半部分链表来高效验证回文特性。
807

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



