学习数据结构的时候遇到一个经典的回文链表问题

  • 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

如果有链表反转的基础,实现链表回文判断就简单的多,如果对反转链表不熟悉,可以参考这篇博客

思路很简单,先找到链表的中间Node,采用的快慢指针法。

  • 慢指针一次走一步,快指针一次走两步,当快指针触底的时候,慢指针到达了重点,如果链表总数是偶数,则慢指针停在相对左边的Node上。
  • 找到中点后,对中点后面的链表进行反转。
  • 从头尾开始向中间移步,每次比较是否相同。
/**
* @author axin
* @since 2019-09-29
*/
public class PalindromeList { @Data
static class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
} } //第一步找到中点
//从中点开始将后续结点反转
//两遍开始next比较直到相遇
public static boolean isPalindrome(ListNode head) {
if(head==null||head.next==null) return true;
if(head.next.next==null){
return head.val == head.next.val;
}
ListNode one = head.next;
ListNode two = head.next.next; while(two.next!=null&&two.next.next!=null){
one = one.next;
two = two.next.next;
}
//链表倒转
ListNode pre = null;
ListNode temp = null;
while(one!=null){
temp = one.next;
one.next = pre;
pre=one;
one = temp;
}
ListNode tail = pre;
//头尾比较
while(head!=null){
if(head.val!=tail.val) return false;
head = head.next;
tail = tail.next;
}
return true;
} public static void main(String[] args) {
ListNode node7 = new ListNode(1);
ListNode node6 = new ListNode(2);
ListNode node5 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node3 = new ListNode(3);
ListNode node2 = new ListNode(2);
ListNode node1 = new ListNode(1);
node6.setNext(node7);
node5.setNext(node6);
node4.setNext(node5);
node3.setNext(node4);
node2.setNext(node3);
node1.setNext(node2); System.out.println("===="+isPalindrome(node1));
} }

链表回文判断(基于链表反转)—Java实现的更多相关文章

  1. 链表回文判断(C++)

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

  2. 链表回文串判断&&链式A+B

    有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...

  3. 链表回文串判断&amp;&amp;链式A+B

    有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...

  4. 【Python】回文palindrome——利用字符串反转

    回文 palindrome Python 字符串反转string[::-1] Slice notation "[a : b : c]" means "count in i ...

  5. 单链表的回文判断(O(n)时间复杂度和O(1)的空间复杂度)

    对于单链表来说,判断回文最简单的方法就是遍历链表,将链表中的元素复制到数组中,然后对数组进行判断是否是回文数组,但是这不符合O(1)的空间复杂度. 由于空间复杂度的要求,需要就地操作链表,不能开辟多余 ...

  6. 算法笔记_030:回文判断(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有 ...

  7. Java实现回文判断

    1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有两种方法可供参考: (1)从字符串两头 ...

  8. 字符串回文判断 js练习

    / 判断一个字符是否为回文,abcba是回文,. /*function fn2(str){ var str1=''; for(var i=str.length-1;i>=0;i--){ str1 ...

  9. 【数据结构】<栈的应用>回文判断

    通过栈与队列相关内容的学习,我们知道,栈是"先进后出"的线性表,而队列是"先进先出"的线性表.可以通过构造栈与队列来实现在这一算法.将要判断的字符序列依次压栈和 ...

随机推荐

  1. SSH安全登陆原理:密码登陆与公钥登陆

      SSH全称(Secure SHell)是一种以安全性闻名的应用层网络通信协议,用于计算机间的安全通信,是目前比较成熟的远程登陆解决方案. 它提供两种方法登陆: 1.密码登陆 2.公钥登陆   密码 ...

  2. C语言20150620

    1-->printf()输出的时候前面没有0 是十进制,前面带0是八进制,前面有0x是十六进制 printf("%d",100):十进制解析 printf("%d& ...

  3. 一些Android的博客,没事翻翻

    深入剖析Android系统(推荐) 深入浅出Android系统移植与平台开发系列(推荐) Android系统开篇(小米工程师对系统的整体分析,推荐) Android6.0Framework源码解析系列 ...

  4. php 截取中文字符串方法

    /** * 截取中文字符串函数 * @param $str 需要截取的字串 * @param $start 开始截取的位置 * @param $length 截取的长度 * @return 此函数返回 ...

  5. C#实现单实例运行

    C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 ...

  6. RocketMQ的一些特性

    一 nameserver 相对来说,nameserver的稳定性非常高.原因有二: 1 nameserver互相独立,彼此没有通信关系,单台nameserver挂掉,不影响其他nameserver,即 ...

  7. Button 控件

    Button 控件是由system.Windows.Forms.button类提供,该控件最常用使用就是编写处理按钮的Click事件及MouseEnter事件代码 常用属性 Text按钮的说明 Ima ...

  8. 使用T-SQL语句创建数据库2

    创建多个数据文件和多个日志文件 use master GO create database book on primaty --主文件组 ( name=‘book_data’, --主文件逻辑文件名 ...

  9. spring mongodb查询

    MongoRepository 查询条件 Keyword Sample Logical result After findByBirthdateAfter(Date date) {"birt ...

  10. 2017年12月24日 JS跟Jquery基础

    js基础 alert();confirm(); 基础语法:与C#一致数据类型及类型转换var (string,decimal)parseInt()parseFloat();isNaN(); 运算符:数 ...