给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
/**
* @Author: DiTian
* @Description:
* @Date: Created in 8:54 2021/8/5
*/
public class CycleTest {
//定义一个节点类
static class ListNode{
int val; //节点值
ListNode next; //next节点
ListNode(int val){
this.val = val;
}
//添加新的节点
public void add(int val){
ListNode newNode = new ListNode(val);
//如果下个节点为空则,添加新节点,否则向下走
if (this.next == null){
this.next = newNode;
}else {
this.next.add(val);
}
}
//打印链表
public void print(){
System.out.print(this.val);
if (this.next != null){
System.out.print("--->");
this.next.print();
}
}
}
public static void main(String[] args) {
ListNode listNode = new ListNode(1);
listNode.add(2);
listNode.add(3);
listNode.add(4);
listNode.next.next.next.next = listNode.next;
boolean flag = hasCycle(listNode);
System.out.println(flag);
}
private static boolean hasCycle(ListNode listNode) {
if (listNode == null || listNode.next == null){
return false;
}
ListNode fast = listNode.next;
ListNode slow = listNode.next;
//当fast节点不为空与slow节点相遇,说明fast节点跑了一圈,存在环
while (fast != null){
if (fast == slow){
return true;
}
fast = fast.next.next;
slow = slow.next;
}
return false;
}
}