一、判断链表是否为带环链表
思路:
- 首先如何判断链表是否有环,这个时候首先需要知道链表是否为空,如果不为空,则继续判断。
- 首先定义两个变量,一个fast,一个slow,让fast 每次走两步,slow每次走一步,当fast和slow相遇时,即是该链表存在环结构。
- 如果该链表为无环结构,则当遍历完这个链表时也不会相遇。即是返回false。
public class Solution {
public boolean hasCycle(ListNode head) {
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;
}
}
二、寻找带环链表的环入口
如果链表为有环结构,则需要寻找到这个的入口,如何寻找到这个入口,可以看看下图讲解。
如图步骤:
寻找环的入口的代码:
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
break;
}
}
if(fast == null || fast.next == null){
return null;
}
slow = head;
while(fast != slow){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
方法2:寻找环入口
import java.util.HashSet;
import java.util.Set;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == null || pHead.next == null)
return null;
HashSet<ListNode> set = new HashSet<ListNode>();
for(;pHead != null;pHead = pHead.next){
if(!set.add(pHead)){
return pHead;
}
}
return null;
}
}