【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<Node,Node> HM=new HashMap<Node,Node>();
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:我这么一直看书,一直总结,在做项目的时候,再思考思考,有没有感觉到,我这是下次考数据结构,必过的节奏啊。。。。。。。。。。
【java基础 13】两种方法判断hashmap中是否形成环形链表的更多相关文章
- (转载)两种方法让HashMap线程安全
HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全. 方法一:通过Collections.synchronizedMap() ...
- JAVA基础之两种核心机制
突然之间需要学习Java,学校里学的东西早就忘记了,得用最短的时间把Java知识理顺,重点还是J2EE,毕竟所有的ava项目中95%都是J2EE,还是先从基础的J2SE学起吧....... 首先是了解 ...
- ubuntu 安装JAVA jdk的两种方法:
ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用pp ...
- Java对象排序两种方法
转载:https://blog.csdn.net/wangtaocsdn/article/details/71500500 有时候需要对对象列表或数组进行排序,下面提供两种简单方式: 方法一:将要排序 ...
- PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码
项目环境是php5.3.28 项目用的ThinkPHP3.2.3 已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...
- java异常处理的两种方法
一种是try-catch-finally,监视代码段,如果有异常就捕获. 另一种是此处不处理,声明在方法后面,抛给上级.(不处理也是一种处理)
- java连接数据库的两种方法总结
方法一:使用jdbc-odbc桥连接sql server,作为中间媒介连接数据库 1.配置数据源:打开控制面版->管理工具->数据源(ODBC)->选用户DSN,按下添加按钮-> ...
- Java 创建线程的两种方法
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...
- JAVA 集合 List 分组的两种方法
CSDN日报20170219--<程序员的沟通之痛> [技术直播]揭开人工智能神秘的面纱 程序员1月书讯 云端应用征文大赛,秀绝招,赢无人机! JAVA 集合 List 分组的两种方法 2 ...
随机推荐
- python之元组,列表和字典的区别
Python语言包含6种内建的序列,其中,有两种主要的类型:列表和元组. 列表是可以修改的,而元组不可以,如果要添加或者删除某些元素,就只能用列表,为了限制某些元素,就会用到元组.一般来说,列表可以替 ...
- HDU 2147 kiki's game kiki的游戏(博弈,找规律)
题意: 给一个有n*m 个格子的棋盘,将一个硬币放在右上角一格,每次可以往左/下/左下移动一格,碰到不能移动的局面者输. 思路: 找P/N状态.先将(n,1)归为P状态,那么能一步到达此位置的有3个位 ...
- 2017.10.1 QBXT 模拟赛
题目链接 T1 枚举右端点,前缀和优化.对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r] ...
- SAP OData编程指南
OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用.我的文章标题前加上SAP的前缀,只是为了表明这篇文章介绍的是Jerry在SAP项 ...
- 程序员的智囊库系列之3--分布式文件系统(Distributed file systems)
程序员的智囊库系列之3--分布式文件系统(Distributed file systems) 这是程序员的智囊库系列的第三篇文章.上一篇文章本来打算介绍几个搭建网站的框架,但由于这部分的内容较多,还需 ...
- PWD简介与妙用(一个免费、随时可用的Docker实验室)
转载自 https://baiyue.one/archives/472.html 本文介绍下 PWD 的历史,并依据本站最近学习心得,经过多次尝试,终于打通了 Docker 与常规宝塔面板搭建,因此, ...
- HTML5中的SSE(服务器推送技术)
本文原链接:https://cloud.tencent.com/developer/article/1194063 SSE技术详解:一种全新的HTML5服务器推送事件技术 前言 概述 基本介绍 与We ...
- Bootstrap 缩略图
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 判断是否是同一人的方法——equals()?在Person类中提供一个比较的方法compare()返回boolean值?对象自己和自己比?
判断是否是同一人的方法——equals() 不能直接用per1==per2,这不是对象内容的比较而是存放对象地址的值得比较 在Person类中提供一个比较的方法compare()返回boolean值 ...
- NOIP2018 - 暑期博客整理
暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...