链表的回文结构(详解)

news2024/11/24 14:38:29

链表的回文结构(详解)

题目:

链表的回文结构

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

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

思路:

  1. 我们想要通过对比链表的前一半和链表的后一半是否相同来判断是否为回文结构

  2. 那我们就要找到中间节点,也就是快慢指针法

  3. image-20240503004231573

  4. 不仅如此,我们还要通过prev来记录slow的前一个节点,这样我们在后面需要对prev进行断联,我们才得到该节点

  5. image-20240503004434010

  6. 这个时候将slow节点和之后的节点进行逆置,创建一个新链表,让slow节点和之后的节点依次头插到新链表当中

  7. image-20240503004915596

  8. 逆置完链表之后,要记得让slow节点之前的节点断联 ,也就是prev->next = NULL

  9. 然后就是遍历原链表 判断两个链表的val值是否相等,不相等返回false,相等返回true

image-20240503001805792

代码:

struct ListNode {
    int val;
    struct ListNode* next;
};

typedef struct ListNode ListNode;
bool chkPalindrome(ListNode* A)
{
    // 创建快慢指针,去找到链表的中间节点
    ListNode* slow, * fast;
    slow = fast = A;

    // 创建一个prev指针去专门指向slow的前一个节点 最终找到的是中间节点的前一个节点
    ListNode* prev = A;

    // 找到中间节点  2slow = fast
    while (fast && fast->next)
    {
        prev = slow; // 指向slow的前一个节点
        slow = slow->next;
        fast = fast->next->next;

    }

    // 此时slow就是A链表的中间节点
    // 这个时候我们逆置slow节点后面的节点
    // 如果和slow节点前面的节点一样,那就是回文结构

    // 创建新链表
    ListNode* newhead = NULL;

    // 将slow节点及以后的节点逆置
    // 也就是让后面的节点依次头插到新链表中
    ListNode* pcur = slow;
    while (pcur)
    {
        ListNode* next = pcur->next; // 让next记载pcur的下一个节点
        pcur->next = newhead; // 让pcur头插到新链表中

        newhead = pcur; // 更新第一个节点
        pcur = next; // 让pcur继续向后遍历
    }
    // 走到这里 slow及slow后面的节点都逆置完毕了
    // 但是有一个需要注意的地方,我们的slow的前一个节点仍然指向的是slow节点
    // 但是我们又新创建了一个逆置链表,那么prev此时的next指针指向的就是逆置链表的尾节点
    // 因此我们需要将prev不在指向slow节点,而是NULL
    prev->next = NULL;

    // 这个时候我们去判断 新链表是否和 A链表第一个节点到slow节点之前相等
    ListNode* cur = A;
    while (cur)
    {
        // 判断原链表和新链表的val值是否相同
        if (cur->val != newhead->val)
            return false; // 不同就返回false
        cur = cur->next; //相同就继续往下走
        newhead = newhead->next;
    }
    // 走到这里说明是回文结构了

    return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机试:字符串相关简单问题

字符移动问题 这道题的描述是这样的:输入一个字符串,将其中的数字字符移动到非数字字符之后,并保持数字字符和非数字字符输入时的顺序。例如:输入字符串“ab4f35gr#a6”,输出为“abfgr#a4356”。 以下使我试着敲的代码&#xff…

GPS与精致农业 无人机应用 农业遥感 农业类

全球定位系统是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。GPS系统最基本的特点是以“多星、高轨、高频、测量-测距”为体制,以高精度的原子钟为核心。GPS作为新一代卫星导航与定位系统,不仅具有全球性、全…

命名空间、C++的输入输出、缺省参数(默认参数)、函数重载

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(解法2)(难度⭐⭐)(72)

1. 题目解析 题目链接:78. 子集 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 为了生成一个给定数组 nums 的所有子集,我们可以利用一种称为回溯(backtracking)的算法…

java项目跑不起来 端口已被使用

背景 Springboot项目跑不起来,原因端口被占用。 解决方法 在 Windows 环境下,你可以按照以下步骤来查看某个端口被占用的情况,并停止相应的进程: 查看所有端口占用情况: 按下 Win R 键,打开运行窗口。…

【八十二】【算法分析与设计】2421. 好路径的数目,928. 尽量减少恶意软件的传播 II,并查集的应用,元素信息绑定下标一起排序,元素通过下标进行绑定

2421. 好路径的数目 给你一棵 n 个节点的树(连通无向无环的图),节点编号从 0 到 n - 1 且恰好有 n - 1 条边。 给你一个长度为 n 下标从 0 开始的整数数组 vals ,分别表示每个节点的值。同时给你一个二维整数数组 edges &#xff…

1262403-92-8,十三肽DOTA-LGEYGFQNALIVR,是一种具有特定氨基酸序列的多肽

一、试剂信息 名称:DOTA-Leu-Gly-Glu-Tyr-Gly-Phe-Gln-Asn-Ala-Leu-Ile-Val-Arg-COOHCAS号:1262403-92-8结构式: 二、试剂内容 DOTA-Leu-Gly-Glu-Tyr-Gly-Phe-Gln-Asn-Ala-Leu-Ile-Val-Arg-COOH是一种具有特定氨基酸序列的多肽&#xff…

Pspice for TI学习

Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…

探索大语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展,大语言模型(LLMs)在自然语言处理(NLP)领域取得了显著的进展。特别是在信息提取(IE)任务中,LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文本…

算法学习:数组 vs 链表

🔥 个人主页:空白诗 文章目录 🎯 引言🛠️ 内存基础什么是内存❓内存的工作原理 🎯 📦 数组(Array)📖 什么是数组🌀 数组的存储📝 示例代码&#…

网页翻译终极方案:DeepLX

为什么要选择 DeepL 翻译? DeepL 被誉为全世界最精准的机器翻译,比最接近他们的竞争对手准确三倍以上 看看 DeepL 和 微软翻译 的对比 👇👇 三句英文: Walking on eggshells during the software update. Wangs VR game is a…

c#实现音乐的“vip播放功能”

文章目录 前言1. c#窗体2. 功能3. 具体实现3.1 添加文件3.2 音乐播放3.3 其他功能 4. 整体代码和窗口5. 依赖的第三方库 前言 最近在QQ音乐里重温周杰伦的歌,觉得好听到耳朵怀孕,兴起想要下载下来反复听,发现QQ音乐VIP歌曲下载下来的格式居然…

【MsSQL】数据库基础 库的基本操作

目录 一,数据库基础 1,什么是数据库 2,主流的数据库 3,连接服务器 4,服务器,数据库,表关系 5,使用案例 二,库的操作 1,创建数据库 2,创建…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月8日,星期三

每天一分钟,知晓天下事! 2024年5月8日 星期三 农历四月初一 1、 我国将对法国等12国免签政策延长至2025年底,旅游平台加码布局入境游。 2、 财政部:下拨1582亿元,提高义务教育阶段家庭经济困难学生补助标准。 3、 4月…

STM32窗口看门狗的操作

STM32的窗口看门狗的主要功能是,程序过早的喂狗还有太晚喂狗,都会触发单片机重启,就是有一个时间段,在这个时间段内喂狗才不会触发单片机重启。 下面我就总结一下窗口看门狗的设置过程: 第一步:开启窗口看…

车辆充电桩|基于Springboot+vue的车辆充电桩管理系统的设计与实现(源码+数据库+文档)

车辆充电桩管理系统 目录 基于Springboot+vue的车辆充电桩管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1 前台功能模块 4.1.1 首页功能 4.1.2 用户后台管理 2 后台功能模块 4.2.1 管理员功能 4.2.2 维修员功能 四、数据库设计 五、核…

菜鸡学习netty源码(四)—— EventLoopGroup

1.概述 我们前面进行过分析,channel为netty网络操作的抽象类,EventLoop负责处理注册到其上的Channel处理的I/O事件;EventLoopGroup是一个EventLoop的分组,它可以获取到一个或者多个的EventLoop对象。 2.类关系图 NioEventLoopGroup的类继承图,蓝色部分为对应的java类,绿…

jQuery-1.语法、选择器、节点操作

jQuery jQueryJavaScriptQuery&#xff0c;是一个JavaScript函数库&#xff0c;为编写JavaScript提供了更高效便捷的接口。 jQuery安装 去官网下载jQuery&#xff0c;1.x版本练习就够用 jQuery引用 <script src"lib/jquery-1.11.2.min.js"></script>…

【经验分享】做多年大数据采集的经验分享:关于电商API数据采集接口做电商必备的电商API接口

国内主流电商平台包括&#xff1a; 1. 淘宝&#xff1a;阿里巴巴旗下的电子商务平台&#xff0c;以C2C和B2C交易为主要业务模式。 2. 天猫&#xff1a;阿里巴巴旗下的B2C电子商务平台&#xff0c;为品牌商和零售商提供销售渠道和服务。 3. 京东&#xff1a;一家以B2C为主营业务…

Linux网络部分——部署YUM仓库及NFS共享服务

目录 一、yum仓库服务 1. 软件仓库的提供方式 2.如何构建并使用ftp软件仓库&#xff08;与本地yum源方法一致&#xff09; 3.如何搭建使用yum在线源&#xff1f; 4.yum软件包下载如何保存&#xff1f; 二、NFS共享存储服务 1.存储类型 2.提供共享存储的组合 3.NFS网络…