LeetCode234题:回文链表
题目描述:
请判断一个链表是否为回文链表。
示例 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题:回文链表相关推荐
- 【leetcode 简单】 第六十七题 回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...
- LeetCode每日一题:回文链表(No.234)
题目:回文链表 请判断一个链表是否为回文链表. 复制代码 示例: 输入: 1->2 输出: false输入: 1->2->2->1 输出: true 复制代码 思考: 先用快慢 ...
- 一道把递归、链表、引用、双指针都结合的题——回文链表
题目描述:给出一个链表,然你判断它是不是回文链表,是则返回true,不是则返回false: 比如1 2 3 5 3 2 1和1 2 3 5 5 3 2 1都是回文链表: 限制条件:控制时间复杂度为O( ...
- leetcode算法题--回文链表
原题链接:https://leetcode-cn.com/problems/palindrome-linked-list/ 1.链表转数组 bool isPalindrome(ListNode* he ...
- leetcode 234题回文链表
回文就是正着念,反着念是一样的,给出了3种解 首先正着最先得数得在右半部分会最后一个,满足栈的先进后出特性所以可以用一个栈来解决这个问题 用N个空间 这太简单了不说了 public static bo ...
- leetcode系列--234.回文链表
leetcode系列–第234题.回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表.如果是,返回 true :否则,返回 false . 输入:head = [1,2,2,1 ...
- 回文链表-python
leetCode第234题 回文链表 链接:https://leetcode-cn.com/problems/palindrome-linked-list 给你一个单链表的头节点 head ,请你判断 ...
- 回文链表—leetcode234
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...
- leetcode234 回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...
最新文章
- CentOS虚拟机和物理机共享文件夹实现
- windows 7下安装VS2005,SQL Server2005,VS2008
- Apache Ant自动化脚本
- 后盾网lavarel视频项目---lavarel用户认证实例
- 【计算机网络】网络安全 : 对称密钥密码体质 ( 数据加密标准 DES | DES 加密过程 | DES 保密性 | 三重 DES 加密 )
- mongodb 时间戳 java_Java将日期类型Date时间戳转换为MongoDB的时间类型数据
- Java注解--Java深度历险(转)
- 光子计算机玩游戏,用于光计算的光子计算机
- 金融统计分析与挖掘实战5.1-5.2
- 错误org.hibernate.HibernateException: Error applying BeanValidation relational constraints的解决方法
- mysql 银行卡卡号长度_卡bin查询sql分享
- matlab 矩阵规定化,Matlab实现直方图规定化
- 声卡中的 line in line out
- delete与垃圾回收机制
- Android go app 安装包,安卓go系统刷机
- nginx实现静态文件的token认证
- CC3200 与 CC2530的SPI通信
- 二叉树前序遍历执行过程
- C语言程序中紧急情况,《C语言及程序设计》实践参考——紧急救援
- JAVA中的Iterator
热门文章
- 20155216 Exp6 信息搜集与漏洞扫描
- python 文字识别 之 pytesseract
- MySQL在windows的my-default.ini配置
- 【系统篇】从int 3探索Windows应用程序调试原理
- Android中最常用也是最难用的控件——ListView
- Delphi开发中增删改查操作以及存储过程的调用方式
- 通过SectionIndexer实现微信通讯录
- Delphi-IOCP学习笔记九======性能测试和IOCP源码下载5000个连接数
- Google认证的SketchUp模型网站
- 广度优先搜索——填涂颜色(洛谷 P1162)