对于一个链表,请设计一个时间复杂度为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 .链表的回文结构相关推荐

  1. 牛客OR36 链表的回文结构

    文章目录 题目 思路: 代码: 题目 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 给定一个链表的头指针A,请返回一个bool值,代表其是否为回 ...

  2. 【牛客】链表的回文结构

    ​​​​​​链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 给定一个链表的 ...

  3. 链表回文(牛客网:OR36 链表的回文结构)

    目录 前言 一,题目分析 1.1什么是回文 1.2题目分析 二,解题思路 情况一: 情况二: tips: 三,源码分享 前言 小伙伴们大家好啊!今天我们为大家带来一篇有关判断链表回文的文章.大家一旦想 ...

  4. 牛客 - 单链表排序

    单链表排序 **BM12** **单链表的排序** 链接 问题描述 代码 BM12 单链表的排序 链接 单链表的排序_牛客题霸_牛客网 (nowcoder.com) 问题描述 给定一个节点数为n的无序 ...

  5. 牛客网 链表结构 算法相关内容

    链表结构 单链表的节点结构  由以下结构的节点依次连接起来所形成的链叫单链表结构 Clas Node<V>{ V value; Node next; } 双链表的节点结构 由以下结构的节点 ...

  6. 【Java】牛客网 链表分割

    题目描述 : 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针. 解题思路 : 假 ...

  7. 牛客网 - 链表相加

    问题: 解题思路: 可以把节点数据提取出来存在列表里然后去算,当然,喜提时间爆表 还是老老实实在走节点的过程中就加然后建立链表 注意进位的设置,卡我十分钟的点在于q = self.reverse(q) ...

  8. 牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案

    牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案 题目描述 据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞 ...

  9. 牛客题霸 [两个链表生成相加链表] C++题解/答案

    牛客题霸 [两个链表生成相加链表] C++题解/答案 题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. ...

最新文章

  1. 如何选择视觉CV光源颜色
  2. 用WidgeDuino创建一个SCADA(监控与数据採集)系统
  3. JAVA test代码运行
  4. 图像变清晰 图像放大 提高分辨率 提高清晰度
  5. 北斗导航 | 基于CRDSS(Comprehensive RDSS, 全面RDSS)的北斗抗干扰技术研究:RDSS+RNSS(论文翻译)
  6. 282. Expression Add Operators
  7. XHTML的使用规范
  8. java流错误的是什么_Java 流异常的标准处理 | 学步园
  9. python模块:array数组模块
  10. matlab中get和set命令,关于matlab中get和set的用法(转)
  11. 能力风暴机器人编程 | 详解使用能力风暴机器人以及配套VJC 4.3 CH做一个物联网——智慧物流项目
  12. VS 2015专业版密钥
  13. 028_adblock
  14. linux用户和组管理的实验报告,LINUX实验三   用户管理
  15. word和wps安装mendeley插件
  16. 架构师之路:如何做一个好的产品架构师
  17. 浅谈临床研究中随机化
  18. ArcGISPro通视分析之视线分析
  19. python成绩查询系统_python成绩查询
  20. 【强化学习】确定性策略强化学习-DPGDDPG算法推导及分析

热门文章

  1. html5考试总结300字,中段考试总结作文300精选集锦
  2. CXF实现服务的发布
  3. 网站日志流量分析系统之(日志收集)
  4. 阿里云服务器安装tomcat
  5. java json字符串转JSONObject对象、转JAVA对象、转List<T>对象
  6. MATLAB text的“关键字”
  7. Java插件自动保存浏览器书签_EverSync插件,浏览器书签同步插件,支持Chrome和Firefox书签同步...
  8. Excel函数大全(Excel Function List)-Part 1
  9. sqlserver中window身份验证跟sql server身份验证的区别
  10. 成为智者的四个敌人——唐望