首页 > 其他 > 详细

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

时间:2018-04-18 21:11:00      阅读:186      评论:0      收藏:0      [点我收藏+]
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;

}

}

}


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

原文:http://blog.51cto.com/12336708/2105067

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!