单链表的回文判断(O(n)时间复杂度和O(1)的空间复杂度)
对于单链表来说,判断回文最简单的方法就是遍历链表,将链表中的元素复制到数组中,然后对数组进行判断是否是回文数组,但是这不符合O(1)的空间复杂度。
由于空间复杂度的要求,需要就地操作链表,不能开辟多余的空间来进行处理,因此引入快慢指针来进行操作。
快慢指针: slow 和 fast,每次slow指针前进一步,fast指针前进两步,当遇到指针为空时说明遍历链表完成,此时也就可以找到链表的中心位置。
注意,由于链表的长度可能是奇数也可能是偶数,因此应该做一个判断。
找到链表的中心后,把链表的后半部分进行就地逆转,就地逆转是采用头插法即可。
后半部分逆转完成后,将链表的前半部分和后半部分一次比较,即可判断是否是回文。
实现代码如下:
链表类定义:
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
链表就地反转:
public static ListNode reverseList(ListNode head){
ListNode ptr = head, ptr2 = head;
ListNode fast = head.next;
while(fast!=null){
//头插法
ptr = fast.next;
fast.next = head;
head = fast;
fast = ptr;
}
//反转完成后将原头指针的next设置为null
ptr2.next = null;
return head;
}
判断链表是否是回文:
public static boolean isPalindrome(ListNode head){
if(head==null || head.next==null){
return true;
}
//建立快慢指针,寻找链表中心
ListNode slow = head;
ListNode fast = head;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
if(fast == null){
//偶数个元素(进行链表反转)
ListNode ptr = slow, ptr2 = slow;
ListNode fast1 = slow.next;
while(fast1!=null){
ptr = fast1.next;
fast1.next = slow;
slow = fast1;
fast1 = ptr;
}
ptr2.next = null;
}else{
//奇数个元素(进行链表反转)
ListNode ptr = slow.next,ptr2 = slow.next;
ListNode fast1 = slow.next.next;
while(fast1 != null){
ptr = fast1.next;
fast1.next = slow.next;
slow.next = fast1;
fast1 = ptr;
}
ptr2.next = null;
slow = slow.next;
}
while(slow!=null){
if(head.val!=slow.val)
return false;
slow = slow.next;
head = head.next;
}
return true;
}
}
单链表的回文判断(O(n)时间复杂度和O(1)的空间复杂度)的更多相关文章
- 链表回文判断(基于链表反转)—Java实现
学习数据结构的时候遇到一个经典的回文链表问题 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 如果有链表反转的基础,实现链表回文判断就简单的多,如 ...
- 判断回文字符串、回文链表、回文数(python实现)
所谓回文字符串,就是正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.即是对称结构 判断回文字符串 方法一: def is_palin ...
- 链表回文判断(C++)
题目描述: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构.保证链表长度小于等 ...
- 【Leetcode链表】回文链表(234)
题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) ...
- 算法笔记_030:回文判断(Java)
目录 1 问题描述 2 解决方案 1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有 ...
- 如何判断单链表是否存在环 & 判断两链表是否相交
给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针sl ...
- Java实现回文判断
1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有两种方法可供参考: (1)从字符串两头 ...
- 字符串回文判断 js练习
/ 判断一个字符是否为回文,abcba是回文,. /*function fn2(str){ var str1=''; for(var i=str.length-1;i>=0;i--){ str1 ...
- 【数据结构】<栈的应用>回文判断
通过栈与队列相关内容的学习,我们知道,栈是"先进后出"的线性表,而队列是"先进先出"的线性表.可以通过构造栈与队列来实现在这一算法.将要判断的字符序列依次压栈和 ...
随机推荐
- 去除GHOST版系统自带的2345流氓软件
话说2345真心流氓 用户想用你 自然不会删你 你这样强制性的 反而引起反感 应该是软件劫持性的捆绑 所以非常难起清除 最方便的方法就是 下载个 黄山IE修复专家 先把IE修复好 然后删除预安装 ...
- (转)JAVA 调用matlab
本文仅用于学习. 原文地址链接:http://blog.csdn.net/wannshan/article/details/5907877 前段时间摸索了java调用matlab东西,不说学的有多深, ...
- docker gitlab,redmine,etc development enviroments
sameersbn-gitlab is better more than officals sameersbn/redmine https://hub.docker.com/r/sameersbn/r ...
- sqlserver 获取当前操作的数据库名称
Select Name From Master..SysDataBases Where DbId=(Select Dbid From Master..SysProcesses Where Spid = ...
- SQL PROMPT 取消dbo前缀
SQL Prompt 无疑大大提高了开发者的效率,高效而简单,特别适合大型的数据库脚本编写,但遗憾得是至今没有可供使用的中文版本.SQL Prompt 默认对象名前面会有 dbo 前缀,在一些场合这样 ...
- 如何解决jQuery Validation针对动态添加的表单无法工作的问题?
为了充分利用ASP.NET MVC在服务端呈现HTML的能力,在<利用动态注入HTML的方式来设计复杂页面>一文中介绍了,通过Ajax调用获取HTML来呈现复杂页面中某一部分界面的解决方案 ...
- Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
需求:在ViewController中,点击Button,push到下一个页面NextViewController,在NextViewController的输入框TextField中输入一串字符,返回 ...
- Naming Conventions for .NET / C# Projects
http://www.akadia.com/services/naming_conventions.html Naming Conventions for .NET / C# Projects Mar ...
- Selenium2学习-000-Selenium2初识
什么是 Selenium?Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个验收测试工具,是一种 Web 测试框架,开拓了验证 Web 应用程序的新方案,使您可在 We ...
- logback的配置和使用
1. logback介绍 logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback-classic和logback-acce ...