题目简述:判断一个链表是否有环,若无环,lastNode.next == null ,若有环,则会一直循环下去
思路1:双指针法,定义【快、慢】两个指针,慢指针每次走一步,快指针每次走两步,若有环,则两者总会相遇,若快指针走到最后为空,则说明没有环,由于快指针比慢指针每次走路快一步,所以不会错过
思路2:哈希表,实例化一个哈希表,若哈希表中没有这个数,则添加,若有,则返回true,若为空则返回false
public class ListNode1 {
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
/**
* 思路一:双指针法,定义快、慢指针,慢指针每次走一步,快指针每次走两步,若有环,则两者总会相遇,
* 若快指针为空,则说明没有环,由于快指针比慢指针每次走路快一步,所以不会错过
* @param head
* @return
*/
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) return false;
ListNode slow = head;
ListNode fast = head.next;
while(slow != fast) {
if (fast == null || fast.next == null) {
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
/**
* 思路二:哈希表,实例化一个哈希表,若哈希表中没有这个数,则添加,若有,则返回true,若为空则返回false
*/
public boolean hasCycleHash(ListNode head) {
Set<ListNode> nodeSet = new HashSet<>();
while (head != null) {
if (nodeSet.contains(head)) {
return true;
}else {
nodeSet.add(head);
}
head = head.next;
}
return false;
}
}