檢測鏈表中是否存在迴環,這裏介紹兩種方法:
- 快慢指針;
- 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;
}