LeetCode 234. Palindrome Linked List C++ 快慢指针

Problem

题目链接

Solution

题意为给定一个链表,每个节点存一个0~9的数字,叫你判断这个链表的内容是否为一个回文串。

思路就是利用快慢指针,快指针每次走两步,慢指针每次走一步,当快指针抵达链表尾部的时候,慢指针到达链表中间,需要注意的是,因为回文串是正读泛读都一样的字符串,因此慢指针移动时,我们需要把链表前半部分的next指针做一个reverse,这样我们就可以在o(n)时间o(1)空间判断是否是回文了。

按照这个思路,我写了以下代码

写的逻辑很混乱

虽然自己测试没什么问题,但是submit会报错

在这里插入图片描述

如果你看出是什么问题,请不吝赐教给我留言

class Solution {
public:
    bool isPalindrome(ListNode *head) {

        if (head == nullptr || head->next == nullptr) return true;

        ListNode *slow = head;
        ListNode *fast = head;
        ListNode *pre = head;
        ListNode *nxt = head->next;

        bool odd = false;

        while (true) {
            if (fast == nullptr) break;
            if (fast->next == nullptr) {
                odd = true;
                break;
            }

            fast = fast->next->next;

            slow = nxt;
            nxt = slow->next;

            if (fast == nullptr) break;
//            if (fast->next == nullptr) {
//                odd = true;
//                break;
//            }
            slow->next = pre;
            pre = slow;
        }

//        return true;

        ListNode *p = nullptr;
        ListNode *q = nullptr;
        if (odd) {
            p=pre->next;
            q=nxt;
        } else {
            p=pre;
            q=slow;
        }
        while (q) {
            if (p->val != q->val) return false;
            q = q->next;
            p = p->next;
        }

        return true;
    }
};

以下代码是在discuss里面大佬的代码,逻辑十分清晰,代码很简洁,学习了!

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if (!head || !head->next) return true;
        ListNode *slow = head, *fast = head, *pre = nullptr, *nxt=nullptr;
        while (fast != nullptr && fast->next != nullptr){
            fast=fast->next->next;
            nxt=slow->next;
            slow->next=pre;
            pre=slow;
            slow=nxt;
        }
        if(fast) slow=slow->next;
        while(slow){
            if(slow->val!=pre->val) return false;
            slow=slow->next;
            pre=pre->next;
        }
        
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值