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

  • 相关阅读:
    软件序列号搜索引擎
    javascript获取url以及jquery获取url参数的方法
    TrueCrypt 一款免费开源的加密软件
    nuit中文文档
    FineUploader 结合 一般处理程序 【上传示例】
    新浪CDN加速类库.
    C#整合VS2010和NUnit
    zencoding更名emmet了.
    visual studio 主题下载网站
    win8无法使用内置管理员账户打开 解决办法
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4684645.html
Copyright © 2011-2022 走看看