用于检测 LinkedList 中循环的 Java 程序
要理解此示例,您应该具备以下 Java 编程的知识:
示例:检测链表中的循环
public class LinkedList {
// create an object of Node class
// represent the head of the linked list
Node head;
// static inner class
static class Node {
int value;
// connect each node to next node
Node next;
Node(int d) {
value = d;
next = null;
}
}
// check if loop is present
public boolean checkLoop() {
// create two references at start of LinkedList
Node first = head;
Node second = head;
while(first != null && first.next != null) {
// move first reference by 2 nodes
first = first.next.next;
// move second reference by 1 node
second = second.next;
// if two references meet
// then there is a loop
if(first == second) {
return true;
}
}
return false;
}
public static void main(String[] args) {
// create an object of LinkedList
LinkedList linkedList = new LinkedList();
// assign values to each linked list node
linkedList.head = new Node(1);
Node second = new Node(2);
Node third = new Node(3);
Node fourth = new Node(4);
// connect each node of linked list to next node
linkedList.head.next = second;
second.next = third;
third.next = fourth;
// make loop in LinkedList
fourth.next = second;
// printing node-value
System.out.print("LinkedList: ");
int i = 1;
while (i <= 4) {
System.out.print(linkedList.head.value + " ");
linkedList.head = linkedList.head.next;
i++;
}
// call method to check loop
boolean loop = linkedList.checkLoop();
if(loop) {
System.out.println("\nThere is a loop in LinkedList.");
}
else {
System.out.println("\nThere is no loop in LinkedList.");
}
}
}
输出
LinkedList: 1 2 3 4
There is a loop in LinkedList.
在上面的例子中,我们用 Java 实现了一个 LinkedList。我们使用了 Floyd 的循环查找算法来检查是否存在循环链表.
注意 checkLoop()
方法中的代码。在这里,我们有两个名为 first
和 second
的变量,遍历 LinkedList
中的节点。
first
- 在单次迭代中遍历 2 个节点second
- 在单次迭代中遍历 1 个节点
两个节点以不同的速度迭代。因此,如果 LinkedList
中存在循环,它们就会相遇。