如何判断一个单链表是否有环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断一个单链表是否有环?相关的知识,希望对你有一定的参考价值。

public class LinkedListRing{

static class LinkedNode<T>{

private T t ;

private LinkedNode<T> next = null;

public LinkedNode(T t) {

this.t=t;

}

public LinkedNode<T> getNext() {

return next;

}

public void setNext(LinkedNode<T> next) {

this.next = next;

}

public String toString(){

return String.valueOf(t) ;

}

}

public static void main(String[] args) {

/**

* 造一个有环链表

*/

LinkedNode<String> l = new LinkedNode<String>("!");

LinkedNode<String> node = null;

LinkedNode<String> last = l;

for(int i=0;i<5;i++){

LinkedNode<String> temp = new LinkedNode<String>(i+"");

last.setNext(temp);

last = temp;

if(i==2){

node = temp;

}

if(i==4){

temp.setNext(node);

}

}

/**

* 寻找环入口

*/

System.out.println(findSingleLinkedRing(l));

}

/**

如何判断一个单链表是否有环?

有环返回进入环的第一个节点,无环返回空

时间复杂度O(N),额外空间复杂度O(1)

 *

 *

 */

public static LinkedNode<String> findSingleLinkedRing(LinkedNode<String> l){

LinkedNode<String> index1 = l;

LinkedNode<String> index2 = l;

try{

while(true){

/**

* 慢指针

*/

index1 = index1.getNext();

/**

* 快指针

* 无环会出java.lang.NullPointerException

*/

index2 = index2.getNext().getNext();

/**

* 无重复则不存在环点

*/

if(index1==null || index2 == null){

return null;

}

/**

* 有重复则将快指针从头单位步长执行,慢指针从之前重复位置执行

*/

if(index1 == index2){

index2 = l;

while(true){

index1 = index1.getNext();

index2 = index2.getNext();

/**

* 再次重合位置为入环位置

*/

if(index1 == index2){

return index1;

}

}

}

}

}catch(NullPointerException e){

return null;

}

}

}


以上是关于如何判断一个单链表是否有环?的主要内容,如果未能解决你的问题,请参考以下文章

8.判断单链表是否有环(6形状)?如何找到环的“起始”点?如何知道环的长度?

11.判断单链表是否有环

判断单链表是否有环

单链表交叉问题(单链表存在环的问题)

判断一个单链表是否有环

判断链表中是否有环 ----- 有关单链表中环的问题