• 判断链表是否回文,空间复杂度不多于 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 的本体,而是一个拷贝的指针。

  • 相关阅读:
    Hadoop的MapReduce基本框架
    通过idea测试Hadoop增删改查
    Linux系统简介以及基本操作(二)
    Linux系统简介以及基本操作(一)
    JAVA解除tomcat 对浏览器特别字符 | () {} [] 的限制
    JAVA实现读取图片
    用java实现取1-100之间的99个不重复的随机数 然后输出没有被取出的数字
    < Android Camera2 HAL3 学习文档 >
    算法<初级>
    算法<初级>
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4684645.html
Copyright © 2020-2023  润新知