NC4 判断链表中是否有环
描述
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。
示例1
输入:
{3,2,0,-4},1
返回值:
true
说明:
第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1(注:头结点为位置0),即-4->2存在一个链接,组成传入的head为一个带环的链表,返回true
代码解析:
- step 1:设置快慢两个指针,初始都指向链表头。
- step 2:遍历链表,快指针每次走两步,慢指针每次走一步。
- step 3:如果快指针到了链表末尾,说明没有环,因为它每次走两步,所以要验证连续两步是否为NULL。
- step 4:如果链表有环,那快慢双指针会在环内循环,因为快指针每次走两步,因此快指针会在环内追到慢指针,二者相遇就代表有环。
Java
public class Solution {
public boolean hasCycle(ListNode head) {
//先判断链表为空的情况
if (head == null)
return false;
//快慢双指针
ListNode fast = head;
ListNode slow = head;
//如果没环快指针会先到链表尾
while (fast != null && fast.next != null) {
//快指针移动两步
fast = fast.next.next;
//慢指针移动一步
slow = slow.next;
//相遇则有环
if (fast == slow)
return true;
}
//到末尾则没有环
return false;
}
}
Python
class Solution:
def hasCycle(self , head: ListNode) -> bool:
#先判断链表为空的情况
if head == None:
return False
#快慢双指针
fast = head
slow = head
#如果没环快指针会先到链表尾
while fast != None and fast.next != None:
#快指针移动两步
fast = fast.next.next
#慢指针移动一步
slow = slow.next
#相遇则有环
if fast == slow:
return True
#到末尾则没有环
return False