本文章分为两部分
一、设置链表的节点LoopNode信息
public class LoopNode {
int data;
LoopNode next = this;
public LoopNode(int data) {
this.data = data;
}
public LoopNode next() { //此方法显示下一个节点
return this.next;
}
public int getData() { //此方法 获取当前节点的值
return this.data;
}
//删除当前节点的下一个节点
public void remove(){
// 取当前节点的下下一个节点
if(this.next.next == null){
this.next = this;
}else{
Node nextNext = this.next.next;
this.next = nextNext;
}
}
public void after(LoopNode node) { //插入节点
// 取出一个点为下下一个节点
LoopNode nextNext = this.next;
// 把新节点作为当前节点的下一个节点
this.next = node;
// 再把下下节点 赋给新节点的下一个节点
node.next = nextNext;
}
}
二、下面简历一个测试类
检测是否有环的思想是
1、给方法传入一个当前节点
2、获得当前节点的下一个节点为慢指针,获得当前节点的下下一个节点为快指针
3、当慢指针追上快指针时 代表有循环回路 否则无循环链表
下面用代码创建一个如下图的循环链表:
public class TestLoopNode {
public static void main(String[] args) {
LoopNode l1 = new LoopNode(1);
LoopNode l2 = new LoopNode(2);
LoopNode l3 = new LoopNode(3);
l1.after(l2);
l2.after(l3);
System.out.println(isLoop(l1));
}
// 判断是否有环 head从当前节点开始寻找
public static String isLoop(LoopNode head){
LoopNode slow = head;
LoopNode fast = head;
//如果存在空节点 ,说明不存在环
if(head == null){
return "无环";
}
//试想如果一个环,你是找不到空节点的,两个步长不一致的指针迟早要相遇
while(slow !=null && fast != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
return "有环";
}
}
return "无环";
}
}