给你一个单链表的头节点 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) 空间复杂度解决此题?
给你一个单链表的头节点 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) 空间复杂度解决此题?
思路1:将链表的数填充到数组中,然后用双指针判断回文
cpp
bool isPalindrome(ListNode* head) {
if(!head) return false;
vector<int> res;
ListNode* pMove=head;
while(pMove){
res.push_back(pMove->val);
pMove=pMove->next;
}
int size=res.size();
int left=0,right=size-1;
while(right>=left){
if(res[left++]!=res[right--]) return false;
}
return true;
}
思路2:递归链表
1、定义一个全局的链表节点指针,指向头节点,pMove
2、递归链表,先让头节点指针frontNode走到尾节点
3、尾节点pMove和frontNode对比,假如不相等,直接返回false
4、如果有一个节点返回false,全部节点都返回false
5、如果返回true,进入下一层继续比较,直到比较全部节点,返回true;
cpp
class Solution {
public:
ListNode* pMove;
bool dromeCycle(ListNode* tail){
if(!tail) return true;
bool ret=dromeCycle(tail->next);
if(!ret) return false;
else{
if(pMove->val!=tail->val) return false;
pMove=pMove->next;
}
return true;
}
bool isPalindrome(ListNode* head) {
if(!head) return false;
pMove=head;
return dromeCycle(head);
}
};
推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:链接