【nowcoder】链表的回文结构

牛客题目链接 链表的回文结构

cpp 复制代码
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstdlib>
// 建议大伙自己对照我的代码画下图,假设A链表是:1 2 3 2 1
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) { // 空间复杂度O(1)
        // 找到中间节点 (slow是3)
        ListNode* slow = A, * fast = A;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        // 反转后半部分 
        //(3 2 1变成1 2 3,但是A并没有变成1 2 1 2 3,A这时是1 2 3,自己画下图就知道了)
        ListNode* cur = NULL, * next = NULL;
        while (slow) {
            next = slow->next;
            slow->next = cur;
            cur = slow;
            slow = next;
        }
        // 前半部分和后半部分比较 (next = A = 1 2 3,cur = 1 2 3)
        next = A;
        while (cur) {
            if (next->val != cur->val) {
                return false;
            }
            next = next->next;
            cur = cur->next;
        }
        return true;
    }

    bool chkPalindrome_(ListNode* A) { // 空间复杂度O(n)
        // 1.创建B链表,将A链表节点依次向B链表头插
        ListNode* B = NULL;
        ListNode* curA = A;
        while (curA) {
            ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
            newNode->val = curA->val;
            newNode->next = NULL;
            if (B == NULL) {
                B = newNode;
            }
            else {
                newNode->next = B;
                B = newNode;
            }
            curA = curA->next;
        }
        // 2.比较
        curA = A;
        ListNode* curB = B;
        while (curA) {
            if (curA->val != curB->val) {
                return false;
            }
            curA = curA->next;
            ListNode* del = curB;
            curB = curB->next;
            free(del);
            del = NULL;
        }
        return true;
    }
};
相关推荐
imuliuliang4 小时前
关于数据结构在算法设计中的核心作用解析7
算法
2401_894915535 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋5 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
普通网友6 小时前
共识算法实现:从工作量证明到权益证明的演进
算法·区块链·共识算法
ldmd2847 小时前
地图生成算法(噪声篇-Perlin,Simplex,Value noise)
算法·go·地图生成
国科安芯8 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
小陈phd8 小时前
集成检索介绍
算法
小poop8 小时前
轮转数组:从暴力到最优,一题掌握算法复杂度分析
数据结构·算法·leetcode
樱桃读报僵尸9 小时前
说说 LLMRouter,Agent 执行过程中怎么动态的选择 LLM
算法