判断链表是否回文,空间复杂度不多于 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值