如何判断链表有没有环,环的大小?环的切入点在哪里以及链表的长度(分别用javascrip和Java代码实现)

<script type="text/javascript">
function Node(n,next){
this.n=n;
this.next = next;
}

//
var node= new Node(1,null);
var linked = node;
for(var i=2;i<8;i++){
var temp = new Node(i,null);
node.next = temp;
node = node.next;
}
//形成链表,链表最后一个指向第三个
node.next = linked.next.next;
node = linked;
//验证是否成环
/*for(var i=0;i<25;i++){
document.write(node.n + "<br>");
node= node.next;
}*/
//如何判断有环,定义两个node,一个块,一个慢,看是否相遇
//让node1和node2同时从起点跑,node2的速度是node1的两倍
var node1 = linked;
var node2 = linked;

//看是否相遇
//设置一个标志flag初始值为false
var flag = false;
for(;(!(node1==node2))||(node1==node2&&node1==linked);){
document.write("循环进来了!"+ "<br>");
if(node2==null||node2.next==null){
//如果链表没环,让false赋值为true
flag = true;
break;
}
node1 = node1.next;
node2 = node2.next.next;
document.write(node1.n  + ":"+ node2.n+"<br>");
}
if(flag==true){
document.write("此链表没有环" + "<br>");
}
if(flag == false){
document.write("此链表有环" + "<br>");
}

//环的大小,让node1和node2接着走,再次相遇即是环的大小
var count=0;
for(;;){
node1=node1.next;
node2 = node2.next.next;
count++;
if(node1==node2){
break;
}
}
document.write("环的大小为:" +count +  "<br>");

//求环的切入点:慢的回到原点,快的原地跑,再次相遇的地方即是切入点
node1=linked;
for(;!(node1==node2);){
node1=node1.next;
node2=node2.next;

}
document.write("环的切入点" + node1.n+"<br>");
//求链表的大小,环的长度加上从头跑到切入点的长度即是链表的长度
node1=linked;
for(;!(node1===node2);){
node1 = node1.next;
count++;
}
document.write("链表的长度为:" + count);

</script>

用Java代码实现:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值