题目描述:

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

思路分析:

迭代法:

避免使用 O(n)O(n) 额外空间的方法就是改变输入。

我们可以将链表的前(后)半部分反转(修改链表结构),然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例,但是使用该函数的人通常不希望链表结构被更改。

该方法虽然可以将空间复杂度降到 O(1)O(1),但是在并发环境下,该方法也有缺点。在并发环境下,函数运行时需要锁定其他线程或进程对链表的访问,因为在函数执行过程中链表会被修改。

整个流程可以分为以下步骤:

找到前(后)半部分链表的尾节点。
反转(前)后半部分链表。
判断是否回文。

java实现:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {if(head == null || head.next == null) {return true;}ListNode slow=head;ListNode fast=head;ListNode pre=null,prepre=null;//反转前半部分指针while(fast!=null&&fast.next!=null){pre=slow;slow=slow.next;fast=fast.next.next;pre.next=prepre;prepre=pre;}if(fast != null) {slow = slow.next;}//比较前后部分指针是否相同while(pre!=null&&slow!=null){if(pre.val!=slow.val){return false;}pre=pre.next;slow=slow.next;}return true; }
}

递归法:

currentNode 指针是先到尾节点,由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val != frontPointer.val 则返回 false。反之,frontPointer 向前移动并返回 true。

算法的正确性在于递归处理节点的顺序是相反的,而我们在函数外又记录了一个变量,因此从本质上,我们同时在正向和逆向迭代匹配。

所谓递归,即从上往下递下去,然后再从下往上归回来。

java实现代码:

class Solution {private ListNode frontPointer;private boolean recursivelyCheck(ListNode currentNode) {if (currentNode != null) {if (!recursivelyCheck(currentNode.next)) {return false;}if (currentNode.val != frontPointer.val) {return false;}frontPointer = frontPointer.next;}return true;}public boolean isPalindrome(ListNode head) {frontPointer = head;return recursivelyCheck(head);}

LeetCode234题:回文链表相关推荐

  1. 【leetcode 简单】 第六十七题 回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...

  2. LeetCode每日一题:回文链表(No.234)

    题目:回文链表 请判断一个链表是否为回文链表. 复制代码 示例: 输入: 1->2 输出: false输入: 1->2->2->1 输出: true 复制代码 思考: 先用快慢 ...

  3. 一道把递归、链表、引用、双指针都结合的题——回文链表

    题目描述:给出一个链表,然你判断它是不是回文链表,是则返回true,不是则返回false: 比如1 2 3 5 3 2 1和1 2 3 5 5 3 2 1都是回文链表: 限制条件:控制时间复杂度为O( ...

  4. leetcode算法题--回文链表

    原题链接:https://leetcode-cn.com/problems/palindrome-linked-list/ 1.链表转数组 bool isPalindrome(ListNode* he ...

  5. leetcode 234题回文链表

    回文就是正着念,反着念是一样的,给出了3种解 首先正着最先得数得在右半部分会最后一个,满足栈的先进后出特性所以可以用一个栈来解决这个问题 用N个空间 这太简单了不说了 public static bo ...

  6. leetcode系列--234.回文链表

    leetcode系列–第234题.回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表.如果是,返回 true :否则,返回 false . 输入:head = [1,2,2,1 ...

  7. 回文链表-python

    leetCode第234题 回文链表 链接:https://leetcode-cn.com/problems/palindrome-linked-list 给你一个单链表的头节点 head ,请你判断 ...

  8. 回文链表—leetcode234

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...

  9. leetcode234 回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...

最新文章

  1. CentOS虚拟机和物理机共享文件夹实现
  2. windows 7下安装VS2005,SQL Server2005,VS2008
  3. Apache Ant自动化脚本
  4. 后盾网lavarel视频项目---lavarel用户认证实例
  5. 【计算机网络】网络安全 : 对称密钥密码体质 ( 数据加密标准 DES | DES 加密过程 | DES 保密性 | 三重 DES 加密 )
  6. mongodb 时间戳 java_Java将日期类型Date时间戳转换为MongoDB的时间类型数据
  7. Java注解--Java深度历险(转)
  8. 光子计算机玩游戏,用于光计算的光子计算机
  9. 金融统计分析与挖掘实战5.1-5.2
  10. 错误org.hibernate.HibernateException: Error applying BeanValidation relational constraints的解决方法
  11. mysql 银行卡卡号长度_卡bin查询sql分享
  12. matlab 矩阵规定化,Matlab实现直方图规定化
  13. 声卡中的 line in line out
  14. delete与垃圾回收机制
  15. Android go app 安装包,安卓go系统刷机
  16. nginx实现静态文件的token认证
  17. CC3200 与 CC2530的SPI通信
  18. 二叉树前序遍历执行过程
  19. C语言程序中紧急情况,《C语言及程序设计》实践参考——紧急救援
  20. JAVA中的Iterator

热门文章

  1. 20155216 Exp6 信息搜集与漏洞扫描
  2. python 文字识别 之 pytesseract
  3. MySQL在windows的my-default.ini配置
  4. 【系统篇】从int 3探索Windows应用程序调试原理
  5. Android中最常用也是最难用的控件——ListView
  6. Delphi开发中增删改查操作以及存储过程的调用方式
  7. 通过SectionIndexer实现微信通讯录
  8. Delphi-IOCP学习笔记九======性能测试和IOCP源码下载5000个连接数
  9. Google认证的SketchUp模型网站
  10. 广度优先搜索——填涂颜色(洛谷 P1162)