【力扣经典题目】链表的回文结构,赶快收藏起来

2023-11-19

题目描述:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

代码格式:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) 
    {
       //write code here
    }
};

本题解法分析:

回文结构,就是从前往后读和从后往前读相同,也就是前半部分和后半部分的逆序相同,那么我们以此为出发点,先把链表分割成两部分,再对后半部分进行逆序,最后进行比较不就好了吗?

  1. 首先找到中间结点
  2. 将中间结点后半部分倒置
  3. 分别从头结点和尾结点向中间遍历,检测在达到中间时刻之间val的值是否都相等

1.找中间节点:我们用快慢指针发法找中间节点,也就是快指针走两步,慢指针走一步,当快指针走到头(即其下一个节点为NULL)的时候,那么此时慢指针也就刚好走到中间。

ListNode* findmidnode(ListNode* A)//快慢指针法
{
    ListNode* phead=(ListNode*)malloc(sizeof(ListNode));//头哨兵
        phead->next=A;
        ListNode* fast=phead;
        ListNode* slow = phead;
        while(fast)
        {
            slow=slow->next;
            if(fast->next)
            {
                fast=fast->next->next;
            }
            else
            {
                return slow;
            }
        }
        return slow;
}

2.反转后半部分链表 :我们首先要记录当前节点cur的下一个节点tmp(以便当前节点被更新后找不到下一个节点),然后使当前节点的next指向前面的prev(初值为NULL,因为结束时头要当尾),再然后使prev=cur,cur=tmp。这样就构成了循环,实现了反转;

ListNode* Listreverse(ListNode* mid)
{
    ListNode* prev = NULL;
    ListNode* cur = mid;
    while(cur)
    {
        ListNode* tmp = cur->next;
        cur->next=prev;
        prev=cur;
        cur=tmp;
    }
    return prev;
}

结合起来就是本题的答案: 

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
ListNode* findmidnode(ListNode* A)
{
    ListNode* phead=(ListNode*)malloc(sizeof(ListNode));//头哨兵
        phead->next=A;
        ListNode* fast=phead;
        ListNode* slow = phead;
        while(fast)
        {
            slow=slow->next;
            if(fast->next)
            {
                fast=fast->next->next;
            }
            else
            {
                return slow;
            }
        }
        return slow;
}
ListNode* Listreverse(ListNode* mid)
{
    ListNode* prev = NULL;
    ListNode* cur = mid;
    while(cur)
    {
        ListNode* tmp = cur->next;
        cur->next=prev;
        prev=cur;
        cur=tmp;
    }
    return prev;
}
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) 
    {
        //找到中间节点
        ListNode* mid = findmidnode(A);
        //反转后半段
        ListNode* reverse = Listreverse(mid);
        while(reverse)//因为reverse的尾部为NULL,而A要比reverse长,我们只判断A的前一半
        {
            if(reverse->val!=A->val)
            {
                return false;
            }
            reverse=reverse->next;
            A=A->next;
        }
        return true;
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【力扣经典题目】链表的回文结构,赶快收藏起来 的相关文章

随机推荐

  • 移远EC800N开发板驱动安装卡死

    开发板 移远EC800N开发板 EC800X QuecPython EVB V1 0 系统 Windows 10 驱动 Quectel ASR Series UMTS LTE Windows10 USB Driver Customer V1
  • vector与list的比较

    本博客只作为自己笔记使用 vector和list的相同点 都是STL中的序列式容器 vector和list的不同点 1 底层结构 vector是一段连续的空间 用动态顺序表实现 而list是一个带头结点的双向链表 2 是否支持随机访问 ve
  • tensorflow人工智能项目-鸟类识别系统

    介绍 Python作业 机器学习 人工智能 模式识别课程 鸟类识别检测系统 这是一个鸟类识别项目 基于tensorflow 使用卷积神经网络实现对200种鸟类进行识别 在数据集中收集了200中鸟类图片 每种鸟类都有着40 60张图片 通过对
  • Mysql Replication与Connector/J原理(四)

    十九 Connector与Failover协议 Mysql Connector J支持failover协议 即Client链接失效时 将会尝试与其他host建立链接 这个过程对application是透明的 Failover协议是 Mult
  • json请求 post vue_vue基础之使用get、post、jsonp实现交互功能示例

    本文实例讲述了vue基础之使用get post jsonp实现交互功能 分享给大家供大家参考 具体如下 一 如果vue想做交互 引入 vue resouce 二 get方式 1 get获取一个普通文本数据 window nl ad func
  • C++:类对象的初始化,构造函数:无参、拷贝构造函数,类中const 成员的初始化,对象的构造顺序

    类的对象 类对象的初始化 构造函数 无参构造函数 拷贝构造函数 类中const 成员的初始化 对象的构造顺序 类对象的初始化 include
  • 解决Jenkins插件不能下载安装的问题

    安装到这一步 显示无法下载Jenkins插件 安装中升级站点 如果你还在安装过程中 遇见这个问题 你可以打开一个新的网页 输入网址http localhost 8080 pluginManager advanced 在最下面的升级站点 把其
  • wimax与anroid的困惑

    我要加入wimax组 研究wimax 但是 为什么是anroid平台呢 wimax和android有关系吗 我们是做wimax芯片的呀 难道wimax芯片上跑anroid系统 好像不太可能 经过分析 应该是xx公司要使用我们的wimax芯片
  • PR-RL:Portrait Relighting via Deep Reinforcement Learning

    文章目录 Title PR RL Portrait Relighting via Deep Reinforcement Learning 1 Article 1 1 Abstract and Introduction 1 2 Conclus
  • thttpd源码分析

    由于最近要自己实现一个嵌入式web服务器 所以开始了对嵌入式web服务器的相关学习 为了使自己对服务器了解更加深入 便找到了开源的服务器进行了相关学习 首先学习的是 thttpd thttpd 是一个小型的 HTTP 服务器 官方网址 ht
  • Elasticsearch 7.13.2启动成功,但无法访问?

    今天在linux服务器上配置了es环境 已经成功运行 如下 原因 elasticsearch出于安全策略考虑 默认仅开启了本地访问 需要额外配置远程访问 备注 生产环境请设置密码 且不要直接开放0 0 0 0 解决 在elasticsear
  • 图像的FFT变换

    一 实验设备 计算机 matlab软件 二 实验目的 1 理解并掌握图像的FFT变换的原理 2 学习使用matlab对图像进行FFT变换 三 实验原理 图像fft变换可以将图像空间域变为频率域 进而对频率域图像进行操作 这样会使操作变得简单
  • vue_cli4遇到的问题及解决

    vue cli4遇到的问题及解决 vue cli4遇到的问题及解决 新建项目时报错 vue cli4遇到的问题及解决 新建项目时报错 新建项目代码 vue create project name 报错信息图 解决办法 检查node版本与np
  • 嵌入式系统C语言编程小心使用局部变量

    问题 今天同事在写一个STM32上的程序时 总是遇到内存溢出的错误 结果发现是因为使用了一个局部变量导致的 因为C语言的局部变量被编译器自动放到栈区的空间 全局变量需要手动申请并释放空间 嵌入式系统的栈区本来就很小 而且要放进去的变量是一个
  • 使用CSS在浏览器中绘制虚拟仪表盘(2020-12-30更新)

    效果
  • 【idea】idea无法打开,常规报错的原因和解决方法

    2020 07 29 更新 mac下因破解无法打开的解决方案 删除 Users 你的名字 Library Preferences IntelliJIdea2019 3 idea vmoptions 添加的内容即可 原因一 老版本的idea没
  • b01lers CTF web 复现

    warmup 按照提示依次 base64 加密后访问 可以访问 flag txt 也就是 Li9mbGFnLnR4dA from base64 import b64decode import flask app flask Flask na
  • Spring基础3——AOP,事务管理

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 AOP简介 1 1 AOP概念 作用 方式
  • 【Qt】智能指针

    https zhuanlan zhihu com p 364014571 ivk sa 1024320u 代码中出现一个bug 最终发现是由于在某个特殊情况下出现了使用垂悬指针 造成了程序崩溃 进而学习了解了Qt的智能指针机制 一 悬垂指针
  • 【力扣经典题目】链表的回文结构,赶快收藏起来

    题目描述 对于一个链表 请设计一个时间复杂度为O n 额外空间复杂度为O 1 的算法 判断其是否为回文结构 给定一个链表的头指针A 请返回一个bool值 代表其是否为回文结构 保证链表长度小于等于900 测试样例 1 gt 2 gt 2 g