判断链表是否回文,空间复杂度不多于 O(1) 时间复杂度不多于 O(n)

要判断是否是回文链表这本身不难,难就难在对那两个复杂度的要求太恶心了。

我一开始的想法是先找出链表的中点,再向两边遍历,以右结点为空作为循环结束的条件。感觉挺好哈,可是这特么是单向链表。

然后我琢磨像 12321 这样的有一个特点,就是 1 + 3 = 2 + 2 = 3 + 1 觉得我特么简直就是天才,居然发现了这么神奇的数学规律,请叫我 X 欧拉。

直到我发现了 000111 = = -> T-T -> QAQ

最终的解决方法是我看了一些博客之后总结的,就是利用递归不断地向后找,直到找到最后一个结点,然后再往回回溯。

这个技巧很有趣,因为这是迭代很难替换的,因为似乎是用到了递归逆天的求值顺序。我之前想不通的一个点就是,怎样在单项链表里往后遍历如今终于是找到了答案。

好了废话这么多,贴一下代码:

bool innerCheck(ListNode *&it, ListNode *checkNode){
    if (checkNode == nullptr){
        return true;
    }
    
    if (!innerCheck(it, checkNode->next)){
        return false;
    }
    
    if (it->val == checkNode->val){
        it = it->next;
        return true;
    }
    
    return false;
}

bool isPalindrome(ListNode* head) {
    auto it = head;
    return innerCheck(it, head);
}

对了还有一个细节需要注意,那就是第一个参数的类型是 ListNode *& 。对,是一个指针的引用,不然函数体内移动的 it 就不是 it 的本体,而是一个拷贝的指针。

原文地址:https://www.cnblogs.com/wuOverflow/p/4684645.html