检测链表中是否存在回环,这里介绍两种方法:
- 快慢指针;
- HashSet 存储原理;
1、快慢指针
快慢指针检查,就是定义两个指针,一个走的快,一个走的慢,如果链表中存在回路,则快的指针最终会追上走的慢的;
就如在学校圆形跑道上跑步,跑的快的人最后还是能和跑的慢的人遇上,但是如果在直道上跑步,就不会遇上;
具体实现如下:
public class Node {
int value;
Node next;
Node(int val) {
this.value = val;
}
}
private boolean circleCheck(Node head) {
if (head == null) {
System.out.println("链表不存在回环");
return false;
}
Node quick = head;
Node slow = head;
while (quick.next != null && quick.next.next != null) {
slow = slow.next;
quick = quick.next.next;
if (quick == slow) {
System.out.println("链表存在回环");
return true;
}
}
System.out.println("链表不存在回环");
return false;
}
2、HashSet 存储原理
HashSet 存储原理就是,同一个值在其中只能存在一个;这样当我们遍历链表的时候,判断 HashSet 是否已存在当前节点的值,如果已存在说明有回路,如果不存在,则将该节点的值放到 HashSet 中,直到遍历结束;
具体实现如下:
public class Node {
int value;
Node next;
Node(int val) {
this.value = val;
}
}
public boolean hasCycle(Node head) {
HashSet<Node> listNodes = new HashSet<>();
Node currentNode = head;
while (currentNode != null && currentNode.next != null) {
if (listNodes.contains(currentNode)) {
System.out.println("链表存在回环");
return true;
}
listNodes.add(currentNode);
currentNode = currentNode.next;
}
System.out.println("链表不存在回环");
return false;
}