单向链表如下图:
单向链表示例图.png
环形链表示意图:
环形链表示意图.png
解题思路:
数学中的追及问题,环形跑道中,速度快的一方必然会追上速度慢的一方,环长=速度差 × 前进次数
具体方法:
两个指针,一个指针每次前进一步,另一个指针每次前进两步,一旦两个指针相遇,那么链表有环
具体代码如下:
/**
* 链表节点
*/
private static class Node{
int data;
Node next;
Node(int data){
this.data = data;
}
}
/**
* 判断是否有环
* @param head 链表首节点
* @return boolean
*/
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;
}
public static void main(String[] args) {
Node node1 = new Node(2);
Node node2 = new Node(5);
Node node3 = new Node(6);
Node node4 = new Node(8);
Node node5 = new Node(9);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node2;
System.out.println(isCycle(node1));
}
网友评论