判断给定的链表是以null结尾还是形成一个环
解法1:使用散列表
1.从表头开始,逐个遍历链表中的每个节点。
2.对于每个节点,检查改节点的地址是否存在于三列表中
3.如果存在,则表明当前访问的节点已经被访问过了,出现这种情况只能是因为给定的链表中存在环。
4.如果三列表中没有当前节点的地址,那么把该地址插入三列表中。
5.重复上述过程,直到到达标尾或者直到环。
解法2:环判断算法
该方法使用两个在链表中具有不同移动速度的指针。一旦它们进入环就会相遇,即表示存在环。这个判断方法的正确性在于快速移动指针和慢速移动指针将会指向同一位置的唯一可能情况,就是整个或者部分链表是一个环。
boolean doeslinkedListContainsLoop(ListNode head) { if(head == null) { return false; } ListNode slowPtr = head, fastPtr = head; while(fastPtr.getNext() != null && fastPtr.getNext().getNext() != null) { slowPtr = slowPtr.getNext(); fastPtr = fastPtr.getNext().getNext(); if(slowPtr == fastPtr) { return true; } } return false; }