🚗题目描述
给定一个链表的 头节点
head
,请判断其是否为回文链表。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
示例 1:
输入: head = [1,2,3,3,2,1] 输出: true
示例 2:
输入: head = [1,2] 输出: false
思路:先利用寻找链表中间结点的函数找到中间结点mid,再从中间结点mid到尾结点进行翻转链表,用rehead指向翻转后链表的头结点,head 和 rehead 同时走进行val值的比较,循环结束的条件为head或者rehead的值为空,链表结点数为奇数和偶数都一样,可看下列图示
ListNode* middleNode(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
while(fast && fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
ListNode* reverseList(ListNode* head) {
if( head== nullptr){return nullptr;}
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur){
ListNode* t = cur->next;
cur->next = pre;
pre = cur;
cur = t;
}
return pre;
}
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* mid = middleNode(head);
ListNode* rehead = reverseList(mid);
while( head && rehead)
{
if(head->val != rehead->val)
{
return false;
}else{
head = head->next;
rehead = rehead->next;
}
}
return true;
}
};
解法二:递归
递归好难,我不会TT。。。 就这样 栈剑