/*
* 链表环问题
* */
public class LinkedIsCycle {
/*
* 链表节点
* */
private static class Node{
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
/*
* 判断链表是否有环
* 时间复杂度:O(n)
* 空间复杂度:O(1)
* @param head 链表头节点
* */
public static boolean isCycle(Node head){
Node p1 = head;
Node p2 = head;
while (p2 != null && p2.next != null) {
p1 = p1.next;
p2 = p2.next.next;
if(p1 == p2) {
return true;
}
}
return false;
}
/*
* 链表环长度的计算
* @param head 链表头节点
* */
public static boolean cycleLength(Node head){
Node p1 = head;
Node p2 = head;
while (p2 != null && p2.next != null) {
p1 = p1.next;
p2 = p2.next.next;
if(p1 == p2) {
int length = 0;
while (true) {
length++;
p1 = p1.next;
p2 = p2.next.next;
if(p1 == p2) {
System.out.println("环的长度是::"+length);
return true;
}
}
}
}
return false;
}
/*
* 判断链表的入环点
* @param head 链表头节点
* */
public static boolean cyclePoint(Node head){
Node p1 = head;
Node p2 = head;
while (p2 != null && p2.next != null) {
p1 = p1.next;
p2 = p2.next.next;
if(p1 == p2) {
p1 = head;
while (true) {
p1 = p1.next;
p2 = p2.next;
if(p1 == p2) {
System.out.println("环的入点是:"+p2.data);
return true;
}
}
}
}
return false;
}
public static void main(String [] args) {
Node node1 = new Node(3);
Node node2 = new Node(1);
Node node3 = new Node(2);
Node node4 = new Node(5);
Node node5 = new Node(7);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node2;
System.out.println("链表是否有环:"+isCycle(node1));
System.out.println("-----------------");
System.out.println(cycleLength(node1));
System.out.println("-----------------");
System.out.println(cyclePoint(node1));
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交