牛客OR36 .链表的回文结构
对于一个链表,请设计一个时间复杂度为O(n), 额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
思路1:
找到链表的中间结点,然后拆开链表,分成两部分,将后半部分逆置,后半部分和前部分比较是否相等,只要有一个走到NULL了,就结束
(1)偶数个
(2)奇数个
这种方法,要把链表拆开
思路2:
不拆链表
(1)偶数个
找到中间结点,
中间结点后的部分逆置,不要拆开
(2)奇数个
struct ListNode {int val;struct ListNode* next;
};bool chkPalindrome(struct ListNode* A)
{//1.先找到中间结点 - 快慢指针struct ListNode* slow = A;struct ListNode* fast = A;while (fast != NULL && fast->next != NULL){slow = slow->next;fast = fast->next->next;}//此时slow就是中间结点//逆置后半部分struct ListNode* n1 = NULL;struct ListNode* n2 = slow;struct ListNode* n3 = slow->next;while (n2 != NULL){n2->next = n1;n1 = n2;n2 = n3;if (n3 != NULL){n3 = n3->next;} }//比较前半部分和后半部分struct ListNode* cur1 = A;struct ListNode* cur2 = n1;while (cur1 != NULL && cur2 != NULL){if (cur1->val == cur2->val){//继续cur1 = cur1->next;cur2 = cur2->next;}else{return 0;}}return 1;
}
找中间结点、链表逆置可以封装成函数。
struct ListNode* reverseList(struct ListNode* head)
{if (head == NULL){return NULL;}struct ListNode* n1 = NULL;struct ListNode* n2 = head;struct ListNode* n3 = head->next;while (n2 != NULL){//翻转n2->next = n1;//继续向后走n1 = n2;n2 = n3;if (n3 != NULL){n3 = n3->next;}}return n1;
}struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow = head;struct ListNode* fast = head;while (fast != NULL && fast->next != NULL){slow = slow->next;fast = fast->next->next;}return slow;
}bool chkPalindrome(struct ListNode* A)
{struct ListNode* slow = middleNode(A);//此时slow就是中间结点//逆置后半部分struct ListNode* newHead = reverseList(slow);//比较前半部分和后半部分struct ListNode* cur1 = A;struct ListNode* cur2 = newHead;while (cur1 != NULL && cur2 != NULL){if (cur1->val == cur2->val){//继续cur1 = cur1->next;cur2 = cur2->next;}else{return 0;}}return 1;
}
牛客OR36 .链表的回文结构相关推荐
- 牛客OR36 链表的回文结构
文章目录 题目 思路: 代码: 题目 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 给定一个链表的头指针A,请返回一个bool值,代表其是否为回 ...
- 【牛客】链表的回文结构
链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 给定一个链表的 ...
- 链表回文(牛客网:OR36 链表的回文结构)
目录 前言 一,题目分析 1.1什么是回文 1.2题目分析 二,解题思路 情况一: 情况二: tips: 三,源码分享 前言 小伙伴们大家好啊!今天我们为大家带来一篇有关判断链表回文的文章.大家一旦想 ...
- 牛客 - 单链表排序
单链表排序 **BM12** **单链表的排序** 链接 问题描述 代码 BM12 单链表的排序 链接 单链表的排序_牛客题霸_牛客网 (nowcoder.com) 问题描述 给定一个节点数为n的无序 ...
- 牛客网 链表结构 算法相关内容
链表结构 单链表的节点结构 由以下结构的节点依次连接起来所形成的链叫单链表结构 Clas Node<V>{ V value; Node next; } 双链表的节点结构 由以下结构的节点 ...
- 【Java】牛客网 链表分割
题目描述 : 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针. 解题思路 : 假 ...
- 牛客网 - 链表相加
问题: 解题思路: 可以把节点数据提取出来存在列表里然后去算,当然,喜提时间爆表 还是老老实实在走节点的过程中就加然后建立链表 注意进位的设置,卡我十分钟的点在于q = self.reverse(q) ...
- 牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案
牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案 题目描述 据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞 ...
- 牛客题霸 [两个链表生成相加链表] C++题解/答案
牛客题霸 [两个链表生成相加链表] C++题解/答案 题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. ...
最新文章
- 如何选择视觉CV光源颜色
- 用WidgeDuino创建一个SCADA(监控与数据採集)系统
- JAVA test代码运行
- 图像变清晰 图像放大 提高分辨率 提高清晰度
- 北斗导航 | 基于CRDSS(Comprehensive RDSS, 全面RDSS)的北斗抗干扰技术研究:RDSS+RNSS(论文翻译)
- 282. Expression Add Operators
- XHTML的使用规范
- java流错误的是什么_Java 流异常的标准处理 | 学步园
- python模块:array数组模块
- matlab中get和set命令,关于matlab中get和set的用法(转)
- 能力风暴机器人编程 | 详解使用能力风暴机器人以及配套VJC 4.3 CH做一个物联网——智慧物流项目
- VS 2015专业版密钥
- 028_adblock
- linux用户和组管理的实验报告,LINUX实验三 用户管理
- word和wps安装mendeley插件
- 架构师之路:如何做一个好的产品架构师
- 浅谈临床研究中随机化
- ArcGISPro通视分析之视线分析
- python成绩查询系统_python成绩查询
- 【强化学习】确定性策略强化学习-DPGDDPG算法推导及分析
热门文章
- html5考试总结300字,中段考试总结作文300精选集锦
- CXF实现服务的发布
- 网站日志流量分析系统之(日志收集)
- 阿里云服务器安装tomcat
- java json字符串转JSONObject对象、转JAVA对象、转List<T>对象
- MATLAB text的“关键字”
- Java插件自动保存浏览器书签_EverSync插件,浏览器书签同步插件,支持Chrome和Firefox书签同步...
- Excel函数大全(Excel Function List)-Part 1
- sqlserver中window身份验证跟sql server身份验证的区别
- 成为智者的四个敌人——唐望