public class Main {
// 节点类:数据,下一个节点
static class Node {
private Integer data;
private Node next;
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
static Node node1 = new Node();
// 判断是否有环:2个变量都指向节点1,指针1走一步,指针2走两步,能相遇代表有环
static boolean hasRound() {
Node pointer1 = node1;
Node pointer2 = node1;
while (pointer1.getNext() != null && pointer2.getNext() != null) {
pointer1 = pointer1.getNext();
pointer2 = pointer2.getNext().getNext();
if (pointer1 == pointer2) {
return true;
}
}
return false;
}
// 获取环的长度:第一次相遇开始计数,直到第二次相遇,就是环的长度
static Integer getLen() {
Integer len = 0;
Node pointer1 = node1;
Node pointer2 = node1;
int i = 0;
while (pointer1.getNext() != null && pointer2.getNext() != null) {
len++;
pointer1 = pointer1.getNext();
pointer2 = pointer2.getNext().getNext();
if (pointer1 == pointer2) {
i++;
if (i == 2) {
return len;
} else {
len = 0;
}
}
}
return 0;
}
// 获取入环节点:第一次相遇后,把指针1指向起始节点,指针1和指针2都每次走一步,直到再次相遇,指向的节点就是入环点
static Node getInNode() {
Node pointer1 = node1;
Node pointer2 = node1;
while (pointer1.getNext() != null && pointer2.getNext() != null) {
pointer1 = pointer1.getNext();
pointer2 = pointer2.getNext().getNext();
if (pointer1 == pointer2) {
break;
}
}
pointer1 = node1;
while (pointer1 != pointer2) {
pointer1 = pointer1.getNext();
pointer2 = pointer2.getNext();
}
return pointer1;
}
public static void main(String[] args) {
node1.setData(1);
Node node2 = new Node();
node2.setData(2);
Node node3 = new Node();
node3.setData(3);
Node node4 = new Node();
node4.setData(4);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(node4);
node4.setNext(node2);
if (hasRound()) {
System.out.println("环长:" + getLen());
System.out.println("入环点:" + getInNode().getData());
}
}
}
算法卷轴(数据卷)[链表的环]
最新推荐文章于 2022-09-04 19:03:53 发布