【算法刷题】链表篇-链表的回文结构

news/2024/5/17 15:45:03/文章来源:https://blog.csdn.net/chuxinchangcun/article/details/125130402

文章目录

      • 题目要求
      • 方法1:思路
        • 代码
      • 方法2
        • 代码

题目要求

链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)


image-20220210162333615

1 -> 2 -> 3 -> 2 -> 1

1 -> 2 -> 2 -> 1

上面两个是回文结构


方法1:思路

  • 1.遍历链表,把结点对应的值放到数组中。
  • 未知数组的大小
    • 法1:直接设置900个空间(题目中已经说明链表长度小于等于900)
    • 法2:遍历链表求出链表的长度,然后再对应开辟数组 ->效率低,不选用
  • 2.判断链表回文->转化成判断数组元素是回文的
    • 双指针
    • 定义头尾指针进行比较,left指针指向最左边,right指针指向最右边。二者指向的元素比较
      • a[left] = a[right] ==> left++ right–
      • a[left] != a[right] ==> return false
    • 循环结束条件:left < right (不取等,当二者指向相同的元素/left > right 说明已经是回文结构了)
    • 若比较完成,退出循环,说明是回文结构。
  • 时间复杂度:0(N)

图解

image-20220210162348177


代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:bool chkPalindrome(ListNode* A) {// write code here//空链表==>不是回文结构if(A == NULL){return false;}//存放到数组中int arr[900];//题目说了,链表长度小于等于900int sz = 0;//标志数组元素//遍历链表,存放元素到数组中struct ListNode* curA = A;while(curA){//放到sz位置上,然后sz++arr[sz++] = curA->val;//curA指向下一个结点curA = curA->next;}//对数组元素进行判断是否是回文结构int left = 0;int right = sz - 1;//最后一个元素while(left < right){if(arr[left] != arr[right]){return false;}left ++;right --;}//数组元素比较完成,说明数组是回文结构  -> 链表是回文的return true;}
};

方法2

  • 1.找到链表的中间结点(使用快慢指针),记为mid
  • 2.将mid到尾结点部分链表进行反转 (使用三指针n1,n2,n3),返回新的头记为rhead
    • n1:初始化为空 ,n2反转要指向的结点
    • n2:要反转的结点
    • n3:保存n2的下一个结点,防止找不到
  • 3.遍历比较[head,rhead)结点 和 [rhead,尾结点] 结点
    • 为了保留两个头结点位置,定义新的变量进行遍历,
    • curA 遍历[head,rhead] curR 遍历[rhead,尾结点]
    • 如果curA和curB指向结点的值不相同 ->不是回文
  • 循环结束条件:curA 或者curB其中一个为空 (curA && curB)
  • 能跳出循环,说明curA和curB指向的值全都相等 ->是回文

图解:

  • 偶数个结点

    image-20220210162415323

  • 奇数个结点

    image-20220210162428836

  • 非回文

image-20220210162445462


注意:反转之前的mid的前一个结点的next仍指向原来的位置

image-20220210162459714


代码

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*///找链表的中间结点 - 快慢指针
struct ListNode* MidNode(struct ListNode* head)
{if(head == NULL){return NULL;}struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;}return slow;
}//反转链表
struct ListNode* ReverseList(struct ListNode* head)
{//只有一个结点/链表为空不用反转if(head == NULL || head->next == NULL){return head;}struct ListNode*n1= NULL,*n2 = head,*n3 = head->next;while(n2){// 反转n2 ->next = n1;//迭代往后走n1 = n2;n2 = n3;//防止n3为空时还往后走,对空指针解引用if(n3 != NULL){n3 = n3->next;}}return n1;
}
class PalindromeList {
public:bool chkPalindrome(ListNode* A) {// write code hereif(A == NULL){return false;}//找中间结点struct ListNode* mid = MidNode(A);//反转中间结点后面的内容struct ListNode* rhead = ReverseList(mid);//遍历前后两部分链表struct ListNode* curA = A;struct ListNode* curR = rhead;while(curA && curR)//while(curR)可以 //while(curA)不可以{if(curA->val != curR->val){return false;}curA = curA->next;curR = curR->next;}return true;}
};

为什么判断条件while(curR)可以,while(curA)不可以?

以上面图解的例子

image-20220210162508709

若以curA为循环结束条件,即当curA指向NULL时才跳出循环,像上面这种情况,curR已经指向空了,再进入循环,就是对空指针进行访问了,出错

image-20220210162527860

若以curR为循环结束条件是可以的

若是回文结构:奇数个结点时:curA和curR同时指向NULL结束 偶数个结点时:curR比curA先指向NULL结束

若不是回文,二者都不会走到NULL,比较时就返回false了

所以循环条件可以写成:while(curA&& curR) ->含义时:curA和curR都不为空就继续,其中一个为空就跳出循环

也可以写成while(curR)

但是不可以写成while(curA)


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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全基础——对称加密算法和非对称加密算法(+CA数字证书)

目录 一、数据传输时的安全特性 二、对称加密算法&#xff1a; 三、非对称加密算法 四、对称加密和非对称加密 — 融合算法&#xff1a; 五、CA数字证书&#xff1a; 一、数据传输时的安全特性 ———————————————————————————————————…

分布式进化算法

1 多解优化问题 多解优化问题是指一类具有多个最优解的复杂优化问题。多峰优化问题和多目标优化问题都是两类典型的多解优化问题&#xff0c;它们之前的统一关系&#xff0c;即都具有多个最优解。多峰优化问题要求算法找到多个具有相同适应度值得最优解&#xff0c;多目标优化问…

SpringBoot的核心原理(扒笔记记录)

这一课的主要重点&#xff1a; 自动装配以及starterJDBC数据库连接池ORM、JPA、MyBatis、Hibernate这样相关的一些技术 从Spring到SpringBoot 我们在工作中都可能用过了SpringBoot&#xff0c;特别是最近几点&#xff0c;Java开发者大军里的一员&#xff0c;我们一般可能上手就…

卷积神经网络相比循环神经网络具有哪些特征

CNN卷积神经网络结构有哪些特点&#xff1f; 局部连接&#xff0c;权值共享&#xff0c;池化操作&#xff0c;多层次结构。 1、局部连接使网络可以提取数据的局部特征&#xff1b;2、权值共享大大降低了网络的训练难度&#xff0c;一个Filter只提取一个特征&#xff0c;在整个…

Docker容器互联

前言&#xff1a; 虽然每个docker容器之间都能通过ip来进行互联&#xff0c;但当容器重新启动&#xff0c;ip就会被重新分配给重新启动的容器&#xff0c;这时同个容器由于重启导致ip不一样了&#xff0c;这时就会导致开发和运维的困难程度大大增加&#xff0c;这时候就要考虑…

springboot+学生信息管理 毕业设计-附源码191219

学生信息管理的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&…

Maven下的依赖管理

依赖管理一. 使用坐标引入jar包二. 快捷方式导入jar包的坐标三. 自动导入设置四. 依赖范围一. 使用坐标引入jar包 使用坐标引入jar包的步骤&#xff1a; 在项目的 pom.xml 中编写 标签在 标签中 使用 引入坐标定义坐标的 groupId&#xff0c;artifactId&#xff0c;version 点…

用于文化遗产的VQA(基于ArtPedia数据集)

艺术 文化遗产领域 VQA parper 阅读 Visual Question Answering for Cultural Heritage 文章目录艺术 文化遗产领域 VQA parper 阅读前言方法visual Question Answering with visual and contextual questionsQuestion Classifier ModuleContextual Question Answering Module…

vue3 | HighCharts实战自定义封装之径向条形图

1.前言 目前正在做vue3的数据可视化项目&#xff0c;vue3的组合式api写法十分方便&#xff0c;可以有各种玩法&#xff0c;有兴趣的同学可以看我个人主页的其他文章。难点是在网上找了一圈的有关径向条形图的示例都没有好的解决方案&#xff0c;决心亲自下手&#xff0c;在其中…

CSP2021初赛游记

csp2022开打,把去年的游记找出来,在这里补了 CSP2021初赛游记 早上7:30去省初门口等crxis,可以和他一起做地铁去,然而最后也就3个学生,准确来说是3个学生加1个家长在等。我当时在微信里和老师说:" 老师你快点过来呀 人好多啊 一大群人在催你 浩浩荡荡 人山人海 局面…

WebKitX ActiveX 5.0.0.15221 Crack

WebKitX ActiveX 封装了 Chromium Embedded Framework (CEF3) 以用于 OLE/COM 语言。Chromium Embedded Framework 封装了 WebKit Blink HTML5 Renderer 和 Google V8 JavaScript Engine。这是一个用于商业用途的生产级稳定组件&#xff0c;将真正在您的桌面和终端应用程序中添…

内网渗透之Msf-Socks代理实战(CFS三层靶场渗透过程及思路)

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;https://blog.csdn.net/m0_63127854?typeblog 内网渗透专栏&#xff1a;https://blog.csdn.net/m0_63127854/category_11885934.html 网络安全交流社区&#xff1a;https://bbs.csdn.ne…

【操作系统】文件系统

文章目录硬盘1 - 基本组成2 - 存储机制Linux文件系统1 - 常见文件类型2 - 文件系统的组成2.1 - 定义2.2 - 作用2.3 - 常见类型2.4 - 分配文件系统3 - 数据存储 层次3.1 - inode表3.2 - Datablock3.3 - Superblock3.4 - GDT 全局描述表4 - 虚拟文件系统 - VFS5 - 软链接与硬链接…

三十页论文与代码已更新 2022数学建模国赛C题 古代玻璃制品的成分分析与鉴别

完整文档获取方式在文章最后 完整文档获取方式在文章最后 完整文档获取方式在文章最后 问题一分析:请在观看问题一分析前先观看附件1数据集的分析与处理(在面包多附件处进行下载)。针对问题1,问题1分为三小问。 首先,需要对玻璃文物的表面风化与其玻璃类型、纹饰和颜色的…

【机器学习】最大期望算法(EM)

1. 什么是EM算法 最大期望算法&#xff08;Expectation-maximization algorithm&#xff0c;又译为期望最大化算法&#xff09;&#xff0c;是在概率模型中寻找参数最大似然估计或者最大后验估计的算法&#xff0c;其中概率模型依赖于无法观测的隐性变量。 最大期望算法经过两…

day10_类和对象的入门

软件存在的意义就是为了解决现实世界当中的问题&#xff0c;它必然模拟现实世界&#xff0c;也就是说现实世界中有什么&#xff0c;软件中就对应有什么。面向对象编程思想中关注点是“对象”或者“事物”&#xff0c;那么在编程语言当中要想创建对象则必须先有类&#xff0c;那…

C/C++语言的服务器LS调研 (Language Server 实现代码索引 跳转定义 智能提示等功能)

LS是什么 先说一下LSP&#xff08;Language Server Protocol&#xff09;&#xff0c;它是语言服务器协议&#xff0c;是一种被用于编辑器或集成开发环境 与 支持比如自动补全&#xff0c;定义跳转&#xff0c;查找所有引用等语言特性的语言服务器&#xff08;LS&#xff0c;(…

Prometheus系列第五篇一核心一ClientLib[java]系统架构

文章目录系统架构架构图架构说明源码架构总结文本协议详细介绍系统架构 架构图 架构说明 类说明CollectorRegister所有Collector的容器,exporter从CollectorRegister获取所有的Metrics度量信息Collector一个Collector为一个metrics的收集器,收集该metrics的labels对应的所有l…

MySQL查询性能优化七种武器之链路追踪

MySQL优化器可以生成Explain执行计划&#xff0c;我们可以通过执行计划查看是否使用了索引&#xff0c;使用了哪种索引&#xff1f; 但是到底为什么会使用这个索引&#xff0c;我们却无从得知。 好在MySQL提供了一个好用的工具 — optimizer trace&#xff08;优化器追踪&…

报告分享|中国音数协游戏工委:2022中国移动游戏市场广告营销报告

全文链接:http://tecdat.cn/?p=28490 中国音数协游戏工委、中国游戏产业研究院、京师游戏研究实验室、CC-Smart新传智库、腾讯广告共同发布《2022中国移动游戏市场广告营销报告》,报告从政策背景Policy background、市场概览Market Overview、投放特征Launch characteristic…