题目描述
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next
指针再次到达该节点,则链表中存在环。
如果有环返回true,没有环返回false!
解题思路
① 使用set进行求解
我们判断当前节点的下一个节点的值是不是存在,我们怎么可以判断有没有环?
可以将每次选取到的元素添加到我们的set集合里面,当我们添加不进去的时候,那就说明这个节点已经存在在我们的set集合里面了,也就说明存在环!
②使用双指针的方式进行求解
我们使用双指针怎么求解?
我们用一个快指针一个慢指针,当快指针等于慢指针的时候,我们就只知道这里肯定存在环了!
代码展示
①使用set
public static boolean hasCycle(ListNode head){
Set<ListNode> set=new HashSet<ListNode>();
while(head!=null){
if(!set.add(head)){ //如果此时添加不进去,就返回true,表示已经形成环了!
return true;
}
head=head.next;
}
return false;
}
②使用双指针
public static boolean hasCycle(ListNode head){
if(head==null || head.next==null) return false;
ListNode slow=head;
ListNode quick=head.next;
while(slow!=quick)
{
if(quick==null || quick.next==null)
return false;
slow=slow.next;
quick=quick.next.next; //可以多走一步
}
return true;
}