热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【java基础13】两种方法判断hashmap中是否形成环形链表

导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写。两种方法,一种是丢手绢法,另外一种,是迷路法。这

导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写。两种方法,一种是丢手绢法,另外一种,是迷路法。


这两种方法的基本思想:假设有环(顿时想到了三个数中找最大的,假设一个最大值有木有,更有木有想到一个排序算法呢?)


一、丢手绢法(指针追赶法)

其实,这种方法时有个很高大上的名称的,叫做指针追赶法。不过,我刚开始想了半天没想明白,后来等我想明白了之后,哇塞,其实思想就是我小时候玩得丢手绢的游戏。

趣说指针追赶法:想象一下小时候玩丢手绢,自己是怎么死的?你妹的,就一个圈,往一个方向跑,自己跑的比别人慢,还没跑几步,然后就被追上了。反例:要是这不是一个圈,咱俩从一个地方往一个方向跑,你老人家跑的比我快,能追上不?(PS:想不明白的,就往死了想玩丢手绢是怎么死的。短跑健将抓小偷,是怎么跑到小偷前面被小偷嘲笑的)

好了,思想说完了,看看代码:

public class stringTest {

	/**
	 * 内部类,模拟链表
	 * @author AngelHHX
	 *
	 */
	public static class Node{  
        int value;  
        Node next;  
        public Node(int n){  
            this.value=n;  
            this.next=null;  
        }  
    } 
	
	public static boolean hasLoop(Node n){
		
		//定义两个指针,一个每次走一步,一个每次走两步
		Node Point1=n;
		Node Point2=n.next;
		
		while(Point2!=null){
			Point1=Point1.next;//每次走一步
			Point2=Point2.next.next;//每次走两步
			if(Point2==null) return false;//不存在环
			
			int value1=Point1.value;
			int value2=Point2.value;
			if(value1==value2) return true;//存在环
		}
		
		return false;//当Point2为null,证明这个链表中只有一个元素
	}
	
	public static void main(String[] agrs) {
		
		Node n1 = new Node(1);
		Node n2 = new Node(2);
		Node n3 = new Node(3);

		n1.next = n2;
		n2.next = n3;
		n3.next = n1;//构造一个带环的链表,去除此句表示不带环

		System.out.println(hasLoop(n1));
	}
}


二、迷路法(查表法)

这个方法的基本思想,真的跟我这个人有关,想明白这个方法的内涵,只需要我自己出门走一圈就OK了! 题外话啊,有小时候看过《少年包青天》的不?里面有一集,就是展昭中毒的那一集,然后公孙策和香香走进了一个树林里,她俩迷路了,然后香香扯那个裙子绑树上打标记,结果走着走着就又回到了原地!

额,想想自己迷路的时候,如果你发现你走了好久,结果又回到了某一个地方,内心崩溃:我他妈的走了半天,竟然还在原地打圈圈!(反正我是这样的)然后再想想数据结构中图的简单回路那一节内容,好好体会吧。

简单说来,就是将指针每走的一个节点记录下来,然后每次走一个节点,就去记录里面查,如果发现重复了,那么恭喜你,迷路了。(链表有环)

代码如下:

import java.util.HashMap;


public class stringTest {

	/**
	 * 内部类,模拟链表
	 * @author AngelHHX
	 *
	 */
	public static class Node{  
        int value;  
        Node next;  
        public Node(int n){  
            this.value=n;  
            this.next=null;  
        }  
    } 
	
	public static boolean hasLoop(Node n){
		
		Node Point1=n;
		HashMap HM=new HashMap();
		
		while(n!=null){
			if(HM.get(Point1)!=null) return true;
			else HM.put(Point1, Point1);
			Point1=Point1.next;
			if(Point1==null) return false;
		}
		
		return false;
	}
	
	public static void main(String[] agrs) {
		
		Node n1 = new Node(1);
		Node n2 = new Node(2);
		Node n3 = new Node(3);

		n1.next = n2;
		n2.next = n3;
		n3.next = n1;//构造一个带环的链表,去除此句表示不带环

		System.out.println(hasLoop(n1));
	}
}


三、总结

以上就是关于是否有环的判断,突然有一种感觉,生活远远比写代码复杂的多!写代码真的跟生活经历有关,好好去体验生活,去经历,真的会很好!接下来的工作,就是把我草稿箱的那些要写的博客都写完,然后看看书!

对于java基础的东西,尤其是数据结构和算法方面的,自己真心比较弱,还请大家多多指教!PS:我这么一直看书,一直总结,在做项目的时候,再思考思考,有没有感觉到,我这是下次考数据结构,必过的节奏啊。。。。。。。。。。


推荐阅读
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 我有3个来自RESEARCHS的映射值,指定要使用参考数据集填充的行中的范围。该研究 ... [详细]
  • HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
author-avatar
patrick0129_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有