当前位置: 首页 > 后端技术 > Java

牛客网高频算法系列-BM6-判断链表是否有环

时间:2023-04-02 09:55:30 Java

牛客网高频算法系列-BM6-判断链表是否有环标题描述判断是否有环给定链表中的环。如果有环则返回true,否则返回false。见原题:BM6判断链表是否有环解法一:双指针法用了两个指针,快慢。它们都从链表的头部开始。随后,慢指针一次向后移动一个位置,而快指针向后移动两个位置。如果链表中存在环路,那么快指针最终会在环中再次遇到慢指针。原理可参考:双指针算法原理详解解法二:Hash方法使用HashSet记录链表中的节点,然后遍历链表节点:如果链表中的节点出现在哈希表,表示链表有环,直接返回true如果链表中的节点没有出现在哈希表中,则将当前节点添加到哈希表中,然后判断下一个节点。最后,如果没有重复节点,则表示没有循环,返回false。代码导入java.util.HashSet;publicclassBm006{/***双指针**@paramhead*@return*/publicstaticbooleanhasCycle(ListNodehead){ListNodefast=head,slow=head;while(fast!=null&&fast.next!=null){//快指针每次移动2步,慢指针每次移动1步fast=fast.next.next;慢=慢.next;if(fast==slow){//fast和slow指针相遇,说明链表有环returntrue;}}//fast和slow指针不相交,说明没有循环returnfalse;}/***Hashmethod**@paramhead*@return*/publicstaticbooleanhasCycle2(ListNodehead){//用来记录链表中不重复的节点HashSetnodes=newHashSet<>();while(head!=null){//如果链表中的节点已经出现,说明有环,returntrueif(nodes.contains(head)){returntrue;}nodes.add(head);head=head.next;}//如果没有重复节点,则表示没有循环,返回false返回false;}publicstaticvoidmain(String[]args){/***测试用例链表的结构是一个循环*testCaseCycle:3->2->0->-4*^|*------------*/ListNodehead=ListNode.testCaseCycle();/***测试用例,预期输出:true*/System.out.println(hasCycle(head));系统输出。println(hasCycle2(head));}}$1.01^{365}≈37.7834343329$$0.99^{365}≈0.02551796445$相信坚持的力量!