题目:
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
数据范围:链表长度 0≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000
要求:空间复杂度 O(1),时间复杂度 O(n)
思路:采取双指针方式,一个指针一直向后走,一个指针缓慢向后走,如果相遇的话,就返回ture,否则返回false
注意的点:进行比较的不是值,而是这个节点,保证了重复出现相同的数字的情况下不会判断出有环。
代码实现:
public boolean hasCycle(ListNode head) {
if (head==null){
return false;
}
//设置头节点
ListNode node=new ListNode(-1);
node.next=head;
设置第一个指针指向头节点
ListNode a=node;
设置第二个指针指向head
ListNode h=head;
int i=0;
while (h!=null){
h=h.next;
i++;
//h指针每移动4次,a指针向后移动一格
if(i%4==0){
a=a.next;
}
//判断是否相遇,如果相遇返回ture,否则返回false,只要有环就会一直循环,无环就会退出循环
if(h==a){
return true;
}
}
return false;
}