判断链表中是否存在环表(Java版)
Posted 阳光照不到的王国
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断链表中是否存在环表(Java版)相关的知识,希望对你有一定的参考价值。
单向链表中存在环的结构如下
解题思路:
类似数学中的追及问题,A和B两个人在一个环形跑道上从同一个起点出发,A依5km/h的速度前行,B依6km/h的速度前行。当经过一段时间后,B必然会追上并超过A,原因非常简单,因为跑道是环形的。
链表中是否存在环表也是这个思路,采用快慢指针法,即设置两个指针表示A运动员和B运动员。A运动员称为慢指针,B运动员称为快指针,慢指针每次向后移动一个结点,快指针每次移动两个结点,然后比较两个指针指向的节点是否相同,如果相同则表示链表有环,如果不同,则继续移动指针。
使用java实现程序如下:
package com.wbl;
/**
* 判断链表中是否有环
*/
public class isCycle {
//定义一个链表的节点
private static class Node{
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
/**
*
* @param head 链表的头结点
* @return 是否有环
*/
public static boolean isCycle(Node head){
Node p1 = head;
Node p2 = head;
while ( p2!=null && p2.next != null){
p1 = p1.next;
p2 = p2.next.next;
if ( p1 == p2){
return true;
}
}
return false;
}
public static void main(String[] args) {
Node node1 = new Node(7);
Node node2 = new Node(5);
Node node3 = new Node(1);
Node node4 = new Node(3);
Node node5 = new Node(9);
Node node6 = new Node(11);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node3;
System.out.println(isCycle(node1) );
}
}
感谢魏梦舒写的《漫画算法》一书,强烈推荐有兴趣小伙伴看看,获益匪浅。
以上是关于判断链表中是否存在环表(Java版)的主要内容,如果未能解决你的问题,请参考以下文章