[Leetcode]同时进行正向和逆向迭代匹配解决回文链表问题

题目链接:234. 回文链表 - 力扣(LeetCode)

题目:

题解:

currentNode 指针是先到尾节点,由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val != frontPointer.val 则返回 false。反之,frontPointer 向前移动并返回 true。

算法的正确性在于递归处理节点的顺序是相反的(回顾上面打印的算法),而我们在函数外又记录了一个变量,因此从本质上,我们同时在正向和逆向迭代匹配。

时间复杂度:O(n),其中 n 指的是链表的大小。

空间复杂度:O(n),其中 n 指的是链表的大小。计算机在递归的过程中将使用堆栈的空间

(在进行回文检查之前,递归函数将在堆栈中创建 n 个堆栈帧,计算机会逐个弹出进行处理。所以在使用递归时空间复杂度要考虑堆栈的使用情况)。

代码:

class Solution {
    ListNode* frontPointer;
public:
    bool check(ListNode* currentNode)
    {
        if(currentNode!=nullptr)
        {
            if(!check(currentNode->next))//先递归到最后位置,后逆向迭代
            {
                return false;
            }
            if(currentNode->val!=frontPointer->val)//匹配是否为回文
            {
                return false;
            }
            frontPointer=frontPointer->next;//正向
        }
        return true;
    }

    bool isPalindrome(ListNode* head) 
    {
        frontPointer=head; //保存第一个位置结点
        return check(head);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Zedd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值