链表之判断一个链表是否为回文结构(三)
来源:互联网 发布:阈值分割算法 编辑:程序博客网 时间:2024/06/08 10:25
package com.chenyu.zuo.linkedList;import com.chenyu.zuo.linkedList.PrintCommonPart.Node;/** * 题目:给定一个头结点,判断该链表是否回文结构 * 例如: * 1->2->1 true * 1->2->2->1 true * 1->2->3 false *思路: *我们只需要几个变量,额外空间复杂度为0(1), *可以在时间复杂度o(N)内完成所有的过程 *改变链表的右半区的结构,使整个右半区反转,最后指向中间节点 *比如1->2->3->2->1 *变成如下结构 *1->2-> * 3->null *1->2-> * *1->2->3->3->2->1 *变成如下结构 *1->2-> 3->null *1->2->3-> *然后从左边和右边分别移动,如果每移动一步每个节点的值都相等 *那么就是回文结构,不然不是 *最后结果不管怎么样,我们应该把链表恢复原来的样子 */public class IsPalindrome3 {public static class Node{//内部类 public Node next; public int value; public Node(int value){ this.value=value; }}public boolean isPalindrome(Node head){ if(head==null || head.next == null){ return true; } Node n1=head; Node n2=head; while(n2.next !=null && n2.next.next !=null){ //查找中间节点 n1=n1.next; //中部 n2=n2.next.next; //尾部 } n2=n1.next;//得到右部分的第一个节点 n1.next=null;//mid.next->null Node n3 = null; while(n2!=null){ //右部分反转 n3=n2.next; //n3->保持下一个节点 n2.next=n1; //下一个反转节点 n1=n2; //n1右移 n2=n3; //n2移动 } n3=n1; //保持最后一个节点 n2=head; //左边第一个节点 boolean result=true; while(n2 != null && n1 !=null){ //检查回文 if(n1.value != n2.value){ result=false; break; } n1=n1.next; n2=n2.next; } n1=n3.next; n3.next=null; //记得设置为空 while(n1!=null){//恢复列表 n2=n1.next; n1.next=n3; n3=n1; n1=n2; } return result; } public static void main(String[] args) { Node firstNode=new Node(1); Node firstNode1=new Node(2); Node firstNode2=new Node(3); Node firstNode3=new Node(2); Node firstNode4=new Node(1); firstNode.next= firstNode1; firstNode1.next= firstNode2; firstNode2.next= firstNode3; firstNode3.next= firstNode4; IsPalindrome3 is=new IsPalindrome3(); System.out.println(is.isPalindrome(firstNode));}}
运行结果:
true
0 0
- 链表之判断一个链表是否为回文结构(三)
- 链表之判断一个链表是否为回文结构(一)
- 链表之判断一个链表是否为回文结构(二)
- 判断一个链表是否为回文结构
- 判断一个链表是否为回文结构(java实现)
- 判断一个链表是否为回文结构
- 判断一个链表是否为回文结构
- 判断一个链表是否为回文结构
- 判断一个链表是否为回文结构
- 判断一个链表是否为回文结构
- 链表问题---判断一个链表是否为回文结构
- 链表问题——判断一个链表是否为回文结构
- java判断一个链表是否是回文结构
- 判断一个链表是否是回文结构 Python 版
- 判断链表是否为回文结构(时间、空间复杂度有要求)
- leetcode系列(16)判断链表是否为回文
- 判断是否为回文结构
- 判断链表是否回文?
- 工厂三兄弟之工厂方法模式(四):重载,隐藏,总结
- GitHub Top 100 简介(Objective-C 项目 )
- Spring注入依赖对象
- linux c socket之多路复用:绑定多个端口
- 常用数据结构的时间复杂度
- 链表之判断一个链表是否为回文结构(三)
- linux c socket之局域网广播
- Javascript 严格模式详解
- linux c sockset之多播
- JavaScript作用域学习笔记
- linux网络编程之-----多播(组播)编程
- 多进程 fork之后父子进程 对文件描述符的作用
- JVM学习02-GC算法与种类
- Linux之广播和多播