题目描述

https://www.nowcoder.com/practice/baefd05def524a92bcfa6e1f113ed4f0?tpId=8&&tqId=11006&rp=1&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

请编写一个函数,检查链表是否为回文。

给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。

测试样例:

{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false

老样子还是先挂代码

import java.util.*;/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Palindrome {public boolean isPalindrome(ListNode head) {
if (head == null) {return false;}if (head.next == null) {return true;}ListNode fp = head;ListNode lp = head;while (fp.next != null && fp.next.next != null) {fp = fp.next.next;lp = lp.next;}ListNode n1 = lp.next;ListNode n2 = n1.next;ListNode n3 = null;lp.next = null;n1.next = null;while (n2 != null) { // 反向链接需要三个节点循环n3 = n2.next;n2.next = n1;n1 = n2;n2 = n3;}ListNode tail = n1;while (head != null && tail != null) {if (head.val == tail.val) {head = head.next;tail = tail.next;} else {n2 = n1.next;n1.next = null;while (n2 != null) {n3 = n2.next;n2.next = n1;n1 = n2;n2 = n3;}lp.next = n1;return false;}}n2 = n1.next;n1.next = null;while (n2 != null) {n3 = n2.next;n2.next = n1;n1 = n2;n2 = n3;}lp.next = n1;return true;}
}

这个代码比较长,但是它的额外空间复杂度为O(1),用最简单的存储比较方式的话需要空间复杂度O(N)或者O(N/2)

代码的原理主要是用一个快指针fp和一个慢指针lp,当fp移动到最后尾部(链表为奇数)或者尾部前一个(链表为偶数)时,lp会达到左半部分的某位,中间的左边(链表为偶数),或者最中间(链表为奇数)

12345677654321对于这个链表,fp会停在右2,lp会停在左7

1234567654321,fp会停在最后1,lp会停在7

然后将右边的链表结构改成逆序,生成两个新的链表,尾节点都指向null,分别遍历比较就好了。

下面附上左神算法课中的三种回文链表的判断方式,空间复杂度分别为O(N),O(N/2),O(1)

import java.util.*;/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Palindrome {public boolean isPalindrome(ListNode head) {
if (head == null) {return false;}if (head.next == null) {return true;}ListNode fp = head;ListNode lp = head;while (fp.next != null && fp.next.next != null) {fp = fp.next.next;lp = lp.next;}ListNode n1 = lp.next;ListNode n2 = n1.next;ListNode n3 = null;lp.next = null;n1.next = null;while (n2 != null) { // 反向链接需要三个节点循环n3 = n2.next;n2.next = n1;n1 = n2;n2 = n3;}ListNode tail = n1;while (head != null && tail != null) {if (head.val == tail.val) {head = head.next;tail = tail.next;} else {n2 = n1.next;n1.next = null;while (n2 != null) {n3 = n2.next;n2.next = n1;n1 = n2;n2 = n3;}lp.next = n1;return false;}}n2 = n1.next;n1.next = null;while (n2 != null) {n3 = n2.next;n2.next = n1;n1 = n2;n2 = n3;}lp.next = n1;return true;}
}

牛客网 在线编程 回文链表相关推荐

  1. 牛客网在线编程----算法入门篇

    标题本篇博文主要是记录下自己的在线编程情况,初次练习,有的算法还待改进,大家有需要可以去牛客网上面多练练! 有需戳–>牛客网在线编程 NC65.题目描述 大家都知道斐波那契数列,现在要求输入一个 ...

  2. 《剑指Offer》面试题四(牛客网在线编程第一题):二维数组中的查找(Java实现)

    题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  3. 牛客网在线编程——二维数组中的查找

    今天是第二次用牛客的在线编程,上次还是去年的七月一号,已然过去近一年的时间,遇到了不少坑,首先题目看错了,没看到数据是有序的,其次就是对二维数组的输入有些不解,是用户手动输入还是现成的,没有说清楚,最 ...

  4. Python:启程 数据分析-牛客网在线编程-中级函数12-23

    DA12 牛客网不同语言使用人数 当时没有做出来,看答案发现有pandas 计数函数value_counts(),详解参考了以下博主的文章 python value_counts()的基础及进阶用法( ...

  5. 牛客网 在线编程 局部最小值位置

    链接:https://www.nowcoder.com/questionTerminal/322eb1da892448f4b18d9b21a6d48c99 来源:牛客网 定义局部最小的概念.arr长度 ...

  6. 解决牛客网在线编程,本地编译结果正确,提交结果不正确问题!!!

    代码提交后显示: 可我vs上编译的结果明明是对的啊: 经过网上一番查找,本地编译结果正确,提交结果不正确问题主要有两个原因: 1. 因为有多组测试用例,所以输入必须是必须是 while(cin> ...

  7. 牛客网在线编程专题《剑指offer-面试题28》字符串的排列

    我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 公众号介绍:Microstrong(小强)同学主要研究机器学习.深度学习.计算机视觉.智能对话系统相关内容,分享 ...

  8. 牛客网在线编程全部题目

    我的状态 题号 题目 知识点 难度 通过率 考察次数 NC1 大数加法 字符串 模拟 中等 43.92% 46 NC2 重排链表 链表 中等 25.94% 11 NC3 链表中环的入口结点 链表 哈希 ...

  9. 牛客网在线编程专题《剑指offer-面试题15》链表中倒数第k个节点

    题目链接: https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167& ...

最新文章

  1. 900万张标注图像,谷歌发布Open Images最新V3版
  2. postman 请求 页面出现 Could not get any response 解决方法
  3. 周末话题-元编程(metaprogramming)
  4. java哈希map 删除_HashMap1.8之节点删除分析
  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid运算符
  6. Livemesh文件同步功能--使用图解
  7. Android传感器-开发指南
  8. 工业交换机常见问题汇总!
  9. vue使用echarts图表
  10. 产品经理晋升后如何带团队?
  11. 将win7笔记本电脑变身WiFi热点,让手机、ipad共享上网!
  12. Docker容器虚拟化与传统虚拟机比较
  13. macOS 10.15安装GDB
  14. python机器学习实战(四)
  15. 手机号码正则_中国大陆手机号码的正则表达式总结ChinaMobilePhoneNumberRegex
  16. 使用Unity粒子特效的基本步骤
  17. (一)市场调查大赛系列——市场调查研究选题
  18. C语言堆栈应用之逆波兰法表达式求值
  19. 亚马逊云科技与德勤中国同行,创造更智慧、美好的数字化未来
  20. 【数据压缩-实验5】JPEG原理分析及JPEG解码器的调试

热门文章

  1. oracle脂肪分析仪,CEM推出油脂快速分析新技术
  2. div模拟textarea文本框,输入文字高度自适应,且实现字数统计和限制
  3. 按钮点击_如何设置微信小程序按钮点击事件?
  4. python一键取消注释_Python文件去除注释的方法
  5. html中的容器和语义标签
  6. Navicat for MySQL 设置定时任务
  7. Requirejs与r.js打包,AMD、CMD、UMD、CommonJS、ES6模块化
  8. ANN:神经网络堆叠/进化故事( 从感知机到DRBN )
  9. java postdata_java发送post请求,使用multipart form-data的方式传递参数,可实现服务器间文件上传功能...
  10. SQL 给字符串补0