141. 环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
目的:
这题是链表是练习,旨在练习链表的用法和特点;因此我们不使用集合等其他方法
思路及解题过程
注意:题中的pos没有卵用,只是让你试着验证答案的
我们注意到如果没有形成环,在链表遍历的途中会在最后一个节点next总会为空的。
我们可以利用快慢指针。
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow=head;
ListNode fast=head;
if(head==null||head.next==null)
{
return false;
}
else
{
while(fast!=null&&fast.next!=null)
{
slow=slow.next;
fast=fast.next.next;
if(slow==fast)
{
return true;
}
}
}
return false;
}
}
快慢指针都可以从头开始循环。
我们注意到,如果是环状的话和非环正好相反,在遍历中会成为死循环,那么,快慢指针(差值之和)在超过环状节点(图中为4,这个数这题没卵用)后必定相遇。
这时我们加一个
if(slow==fast)
{
return true;
}
的判断条件就可以直接判断返回了。
到此为止就结束了。
后言:
希望喜欢的同学点个赞哦!