继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

萌萌小温柔
关注TA
已关注
手记 306
粉丝 56
获赞 401

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;

}

}

}


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP