链表回文(牛客网:OR36 链表的回文结构)
目录
前言
一,题目分析
1.1什么是回文
1.2题目分析
二,解题思路
情况一:
情况二:
tips:
三,源码分享
前言
小伙伴们大家好啊!今天我们为大家带来一篇有关判断链表回文的文章。大家一旦想到回文,那么第一感觉是无从下手,因为我们可能需要在原地修改链表,然后进行比较。但是当你看完这篇文章的时候,相信你一定会有一个更深层次的了解。
一,题目分析
1.1什么是回文
回文,就是一组数,顺着读和反着读是一样的,比如:12321。这样的一组数我们称为回文数。那么链表回文当然也是一样的结构。
1.2题目分析
如下图所示,我们看到题目中要求,我们必须使用时间复杂度为O(n),空间复杂度为O(1)的算法。那么就说明我们是不能使用额外的空间,只能在原链表的基础上进行改变,判别。
二,解题思路
情况一:
那么鉴于上面的题目,我们有以下分析:
上图所示,是一个回文链表,那么我们认为既然是回文,肯定会有一个中间节点,我们可以将该节点作为新链表的头节点,然后将其反转。
这样我们就得到了下面的图:
那么我们看到,当新链表反转之后,得到的便是一个新链表。这个链表当然不同于原链表的结构,因为我们是将中间节点及之后的链表进行了反转。此时节点 4 的 next 依旧指向节点 5 ,但是这一点也不影响我们判断是否是回文。
现在假设是有两个新链表,然后我们对其进行比较,两个链表的 4 节点比较完事之后。最后一个比较的节点都是 5 ,此时表示原链表是回文结构。
情况二:
上面所示,是一种很常见的回文结构,那么当然还有另一种情况:123321,这样子也是回文。
但是我们知道,一般情况下,如果对于一组数个数为偶数的话,那么它的中间节点将是第二个中间节点,也就是这里我们有两个 3 ,但是我们用后面那个 3 作为该链表的中间节点,然后进行翻转,得到两个新链表也是一样的。
tips:
因为比较的循环的结束,是通过判别后面得到的新链表是否结束来决定的。所以我们不用担心,这种情况下,原头结点所在的链表还链接在原中间节点,没有全部比较完。因为我们已经达到了目的,已经判别完是否是回文结构了。
三,源码分享
因为这里我们用到了额外的两个接口。分别是查找中间节点,以及反转链表。如有小伙伴有需要,可自行食用哦!
LeetCode:206. 反转链表_憨憨二号耶!的博客-CSDN博客
LeetCode:876. 链表的中间节点_憨憨二号耶!的博客-CSDN博客
struct ListNode* middleNode(struct ListNode* head){struct ListNode*fast=head;struct ListNode*slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}return slow;
}struct ListNode* reverseList(struct ListNode* head){struct ListNode*n1=NULL;struct ListNode*n2=head;if(head==NULL)return NULL;struct ListNode*n3=head->next;while(n2){//核心n2->next=n1;//移动n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}class PalindromeList {
public:bool chkPalindrome(ListNode* A) {struct ListNode*slow=middleNode(A);struct ListNode*head=reverseList(slow);struct ListNode*cur=A;while(head){if(cur->val != head->val){return false;}else{head=head->next;cur=cur->next;}}return true;}
};
好的,那么对于本文的分享到此就结束啦!如有问题,还请指正呀!
链表回文(牛客网:OR36 链表的回文结构)相关推荐
- “小朋友大人排队”问题(十分钟带你玩转 牛客网 CM11 链表分隔)
目录 前言 情景化分析 一,案例题目分析 1.1题目要求 1.2题目解析 二,思路分析 1.2 第一步思路 1.2之后步骤 三,源码分享 前言 小伙伴们大家好啊!今天小编为大家带来一篇牛客网上,有关链 ...
- 【链表】牛客网:链表内指定区间反转
leetcode 206 如何原地反转单链表?_暮色_年华的博客-CSDN博客 这题是LeetCode206的变形 思路: 取出子链表后反转后连入原链表 import java.util.*;/** ...
- 【Java】牛客网 删除链表中重复的结点
题目描述 : 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表 1->2->3->3->4->4->5 ...
- 【链表】牛客网:链表删除
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点.返回删除后的链表的头节点. 1.此题对比原题有改动 2.题目保证链表中节点的值互不相同 3.该题只会输出返回的链表和结果做对比,所以 ...
- 回文链表 牛客网 程序员面试金典 C++ Python
回文链表 牛客网 程序员面试金典 C++ Python 题目描述 请编写一个函数,检查链表是否为回文. 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文. 测试样例 ...
- 华为牛客网在线笔试题之是否是回文串
最近投了个华为的简历,然后收到了牛客网的在线笔试,题目有三道,第一道是给定一串字符,找出其中最长的回文串,并返回其长度. 我用C++实现的,思路是遍历字符串的每一个字符,然后设置初始值为1的偏移量,如 ...
- 牛客网 2018校招真题 京东 回文
Description 牛客网 2018校招真题 回文 Solving Ideas 计算以str[str.length() - 1]为结尾的最大的回文长度,从而判断最少需要追加多少个字母才能使整个串成 ...
- 【牛客网面试必刷TOP101】链表篇(一)
链表 一.前言 二.学习刷题网站 1.推荐的原因 三.刷题 <1>反转链表 递归法 <2>链表内指定区间反转 ①头插法 ②递归法 <3>链表中的节点每k个一组翻转 ...
- 牛客题霸 [链表中环的入口节点] C++题解/答案
牛客题霸 [链表中环的入口节点] C++题解/答案 题目描述 对于一个给定的链表,返回环的入口节点,如果没有环,返回null 拓展: 你能给出不利用额外空间的解法么? 题解: 判断环有个很巧妙的方法, ...
最新文章
- 功能更新|DAS推出全局Workload优化功能,实现SQL自动诊断
- SUID + SGID + STICKY
- mysql消息队列的原理_PHP和MySQL实现消息队列
- php 获取config,PHP MVC如何自动调用config?
- CDM是什么?和CDP有什么区别?
- java final resource_java 中的常量定义,final 的问题
- 《Python游戏趣味编程》 第7章 飞机大战
- Rplidar学习(三)—— ROS下进行rplidar调试
- Java TemplateProcessingException之Cannot execute subtraction: operands are null and #1234
- win7旗舰版配置FTP- 添加用户
- 唯有志存高远,方能风行天下
- ubuntu使用certbot给nginx添加ssl证书
- Thinkpad 笔记本电源状态指示灯
- IP和局域网 简单了解
- 网络是如何连接的--读书笔记
- 蓝底寸照该如何在手机上修改照片底色
- ceres学习笔记(四)
- 如何将本地代码文件上传到阿里云的git上面
- 【386w.com——菜鸟收藏:64位和32位系统之间的区别】
- Ardupilot chibios编译,启动,main函数学习(2)
热门文章
- 【DOTA】目标检测数据集介绍与使用
- word错误,定义的索引
- MFC计算机图形学(2)
- socketio连接失败,nginx返回502 connect failed (111: Connection refused)问题解决
- python通过fancy indexing把数组转换为one hot编码的numpy array
- android熔断,限流熔断技术
- 聚焦能源 | 赛宁网安亮相2023年中国能源网络安全大会
- matlab ycbcr函数,matlab中rgb2ycbcr
- 电脑里每个盘下都出现$RECYCLE.BIN和system volume information等文件夹
- 特性二、Objective-C的Attributed属性