题解 | 链表的回文结构

链表的回文结构

https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
  public:
    //反转链表
    ListNode* reverseList(ListNode* head) {
        //创建一个新链表,将原链表中的每一个结点通过头插加到新链表
        ListNode* newHead = nullptr;
        ListNode* pcur = head;

        while (pcur != nullptr) {
            ListNode* next = pcur->next;
            pcur->next = newHead;
            newHead = pcur;
            pcur = next;
        }
        return newHead;
    }

    bool chkPalindrome(ListNode* A) {
        if (A == nullptr || A->next == nullptr) {
            return true;
        }

        //1.找中间结点
        ListNode* fast = A;
        ListNode* slow = A;
        while (fast != nullptr && fast->next != nullptr) {
            slow = slow->next;
            fast = fast->next->next;
        }
        ListNode* mid = slow;

        //2.反转后半段链表
        ListNode* revertseHead = reverseList(mid);

        //3.比较前半段和反转后的后半段
        ListNode* p1 = A;
        ListNode* p2 = revertseHead;
        bool res = true;
        while (res && p2 != nullptr) {
            if (p1->val != p2->val) {
                res = false;
            }
            p1 = p1->next;
            p2 = p2->next;
        }

        //4.恢复原链表的顺序
        slow->next = reverseList(revertseHead);

        return res;
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-22 11:33
点赞 评论 收藏
分享
07-23 15:05
门头沟学院 Java
熊大不大:不好意思KPI数据刚刚刷新,刚刚达标
点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-25 17:55
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务