LC-环形链表
链接:https://leetcode.cn/problems/linked-list-cycle/
描述:给你一个链表的头节点 head ,判断链表中是否有环。
思路:如果一个链表有环,当它进入环之后,就会沿着环一直走,这时如果我们新增一个指针,让他沿着链表走,某时某刻他们就会相遇,肯定需要一个快一个慢,这样才会快的追上慢的,如果每次移动的距离一样肯定不行。我们可以设置快慢指针,慢指针一次走一步,快指针一次走两步,这样他们肯定会相遇。
以例1为例:
我们创建a,b两个指针,a是慢指针,b是快指针。
a指针首先在3处,b在0处,我们对比这两个节点是否相等(节点的值可能一样,所以不能拿节点的val去对比)。如果相等,说明有环;如果不相等,a向后移动到2,b向后移动2步也到2;这时判断a和b就是一样,所以有环。
public boolean hasCycle(ListNode head) {
//当链表为空或者下一节点为空,肯定是没有环的
if(head == null || head.next == null){
return false;
}
//当一个节点形成环时(当前节点的next指向自己)
if(head == head.next){
return true;
}
ListNode a = head, b = head.next.next;
while (b != null && b.next != null && b.next.next != null) {
if (a != b) {
//a节点向后移动一位
a = a.next;
//b节点向后移动两位
b = b.next.next;
} else {
return true;
}
}
return false;
}
附:
下一章:LC-环形链表(找到环的入口)