前言
LeetCode算法第141题,是判断环形链表。
其实这题算是比较简单,思路也不复杂,这次就把Java的代码简单实现一下。
方式一:无限循环
/***方式一:无限循环*/privatestaticbooleantest1(ListNodehead){inti=0;booleanfal=false;ListNodenext=head;while(next!=null){if(i>10000000){fal=true;break;}i++;next=next.next;}returnfal;}
方式二:hash表
privatestaticbooleantest2(ListNodehead){Set<ListNode>set=newHashSet<>();booleanfal=false;ListNodenext=head;while(next!=null){if(set.contains(next)){fal=true;break;}set.add(next);next=next.next;}returnfal;}
方式三:双指针
/***方式三:双指针*/privatestaticbooleantest3(ListNodehead){booleanfal=false;//快、慢指针ListNodeindex=head;ListNodenext=head;while(next!=null){ListNodetoIndex;if(null==index||(toIndex=index.next)==null||(index=toIndex.next)==null){break;}next=next.next;if(next==index){fal=true;break;}}returnfal;}
测试数据准备
/***判断链表是否有环**@Author:ZRH*@Date:2021/10/913:57*/publicclassTest1{/***方式一:无限循环*方式二:hash表*方式三:双指针**@paramargs*/publicstaticvoidmain(String[]args)throwsIOException{finalListNodelistNode=buildNode();//方式一:无限循环System.out.println("方式一:无限循环:"+test1(listNode));//方式二:hash表System.out.println("方式二:hash表:"+test2(listNode));//方式三:双指针System.out.println("方式三:双指针:"+test3(listNode));}/***构建链表结构**@return*/privatestaticListNodebuildNode(){ListNodefirst=newListNode(1);ListNodenext=first;ListNodelinkListNode=null;for(inti=2;i<100000;i++){ListNodelistNode=newListNode(i);next.setNext(listNode);next=listNode;if(i==70000){linkListNode=listNode;}}//随机制作环next.setNext(linkListNode);returnfirst;}/***自定义链表节点*/@DataprivatestaticclassListNode{privateListNodenext;privateIntegervalue;publicListNode(Integervalue){this.value=value;}@OverridepublicinthashCode(){returnvalue.hashCode();}}}
最后
虚心学习,共同进步 -_-