1. 定义单链表的数据结构类-Node
//定义vlue
public int value;
//定义当前节点的下一个节点
public Node next;
public Node(int val) {
this.value = val;
}
2. 判断链表是否成环
2.1 使用java容器的方式:
public static Node findLoop2(Node node) {
if (node == null) {
return null;
}
Set<Node> set = new HashSet();
while (node.next != null) {
if(!set.add(node)){
return node;
}
node=node.next;
}
return null;
}
2.2 使用快慢指针去查找成环点
public static Node findLoop(Node node) {
//提前判空,node.next.next 节点
if (node == null || node.next == null || node.next.next == null) {
return null;
}
//慢指针走一步
Node slow = node.next;
//快指针走两步
Node fast = node.next.next;
//循环条件:快慢不相等继续循环
while (slow != fast) {
//判断循环的结束条件,当快指针的下个节点和下下个节点为null,说明当前链表不成环
if (fast.next == null || fast.next.next == null) {
return null;
}
// 将指针指向下一个节点,保证链表的继续循环
slow = slow.next;
fast = fast.next.next;
}
//上面循环结束,说明slow和fast相等,二者同时指向一个节点
//让快指针重新指向头节点
fast = node;
//继续循环,每次直走一步,下次再相遇就是成环的第一个节点
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
3. 函数测试
public static void main(String[] args) {
Node node = new Node(1);
node.next = new Node(2);
node.next.next = new Node(3);
node.next.next.next = new Node(4);
node.next.next.next.next = new Node(5);
node.next.next.next.next.next = new Node(6);
node.next.next.next.next.next.next = node.next.next.next;
Node resNode = findLoop2(node);
System.out.println(resNode.value);
}