为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
SQL Server

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;

}

}

}


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消