目录

前言

一,题目分析

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 链表的回文结构)相关推荐

  1. “小朋友大人排队”问题(十分钟带你玩转 牛客网 CM11 链表分隔)

    目录 前言 情景化分析 一,案例题目分析 1.1题目要求 1.2题目解析 二,思路分析 1.2 第一步思路 1.2之后步骤 三,源码分享 前言 小伙伴们大家好啊!今天小编为大家带来一篇牛客网上,有关链 ...

  2. 【链表】牛客网:链表内指定区间反转

    leetcode 206 如何原地反转单链表?_暮色_年华的博客-CSDN博客 这题是LeetCode206的变形 思路: 取出子链表后反转后连入原链表 import java.util.*;/** ...

  3. 【Java】牛客网 删除链表中重复的结点

    题目描述 : 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表 1->2->3->3->4->4->5 ...

  4. 【链表】牛客网:链表删除

    给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点.返回删除后的链表的头节点. 1.此题对比原题有改动 2.题目保证链表中节点的值互不相同 3.该题只会输出返回的链表和结果做对比,所以 ...

  5. 回文链表 牛客网 程序员面试金典 C++ Python

    回文链表 牛客网 程序员面试金典  C++ Python 题目描述 请编写一个函数,检查链表是否为回文. 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文. 测试样例 ...

  6. 华为牛客网在线笔试题之是否是回文串

    最近投了个华为的简历,然后收到了牛客网的在线笔试,题目有三道,第一道是给定一串字符,找出其中最长的回文串,并返回其长度. 我用C++实现的,思路是遍历字符串的每一个字符,然后设置初始值为1的偏移量,如 ...

  7. 牛客网 2018校招真题 京东 回文

    Description 牛客网 2018校招真题 回文 Solving Ideas 计算以str[str.length() - 1]为结尾的最大的回文长度,从而判断最少需要追加多少个字母才能使整个串成 ...

  8. 【牛客网面试必刷TOP101】链表篇(一)

    链表 一.前言 二.学习刷题网站 1.推荐的原因 三.刷题 <1>反转链表 递归法 <2>链表内指定区间反转 ①头插法 ②递归法 <3>链表中的节点每k个一组翻转 ...

  9. 牛客题霸 [链表中环的入口节点] C++题解/答案

    牛客题霸 [链表中环的入口节点] C++题解/答案 题目描述 对于一个给定的链表,返回环的入口节点,如果没有环,返回null 拓展: 你能给出不利用额外空间的解法么? 题解: 判断环有个很巧妙的方法, ...

最新文章

  1. 功能更新|DAS推出全局Workload优化功能,实现SQL自动诊断
  2. SUID + SGID + STICKY
  3. mysql消息队列的原理_PHP和MySQL实现消息队列
  4. php 获取config,PHP MVC如何自动调用config?
  5. CDM是什么?和CDP有什么区别?
  6. java final resource_java 中的常量定义,final 的问题
  7. 《Python游戏趣味编程》 第7章 飞机大战
  8. Rplidar学习(三)—— ROS下进行rplidar调试
  9. Java TemplateProcessingException之Cannot execute subtraction: operands are null and #1234
  10. win7旗舰版配置FTP- 添加用户
  11. 唯有志存高远,方能风行天下
  12. ubuntu使用certbot给nginx添加ssl证书
  13. Thinkpad 笔记本电源状态指示灯
  14. IP和局域网 简单了解
  15. 网络是如何连接的--读书笔记
  16. 蓝底寸照该如何在手机上修改照片底色
  17. ceres学习笔记(四)
  18. 如何将本地代码文件上传到阿里云的git上面
  19. 【386w.com——菜鸟收藏:64位和32位系统之间的区别】
  20. Ardupilot chibios编译,启动,main函数学习(2)

热门文章

  1. 【DOTA】目标检测数据集介绍与使用
  2. word错误,定义的索引
  3. MFC计算机图形学(2)
  4. socketio连接失败,nginx返回502 connect failed (111: Connection refused)问题解决
  5. python通过fancy indexing把数组转换为one hot编码的numpy array
  6. android熔断,限流熔断技术
  7. 聚焦能源 | 赛宁网安亮相2023年中国能源网络安全大会
  8. matlab ycbcr函数,matlab中rgb2ycbcr
  9. 电脑里每个盘下都出现$RECYCLE.BIN和system volume information等文件夹
  10. 特性二、Objective-C的Attributed属性