来源:《剑指offer》
思路:使用快慢指针遍历链表,如果是环形链表,则快慢指针一定在环的入口(也是环的结束点)相遇
package test;
public class CircleLink {
public static void main(String[] args)
{
CircleLink.MyLink link =createLink();
link.showLink();
System.out.println(isCyclicLink(link));
}
public static CircleLink.MyLink createLink()
{
MyLink link = new MyLink();
Node pHead = new Node();
link.head = pHead;
pHead.data = "first";
Node node = pHead;
for(int i=2;i<10;i++)
{
Node temp = new Node();
temp.data =i+"";
node.next = temp;
node = temp;
}
//node.next = pHead.next.next;//末尾节点指向某节点,形成环形链表
return link;
}
/*使用快慢指针遍历链表,若相遇则是环形链表,若需要寻找环入口,则从头以及从这个相遇的点每次往前走一步,相遇点必是环入口*/
public static boolean isCyclicLink(MyLink link)
{
if(link.isEmpty()) return false;
boolean result = false;
Node pHead = link.getHead();
Node fast = pHead;
Node slow = pHead;
while(slow!=null&&fast.next!=null )
{
fast = fast.next.next;
slow = slow.next;
if(fast == slow) return true;
}
return result;
}
//定义链表节点的内部类
static class Node{
String data;
Node next = null;
}
//定义一个链表的内部类
static class MyLink{
Node head = null;
boolean isEmpty()
{
if(this.head ==null) return true;
return false;
}
Node getHead()
{
return this.head;
}
void showLink()
{
Node pHead = getHead();
Node node = pHead;
int count = 0;
//这里人为限制了展示的长度,防止是环形链表时成为死循环,可以加一个检测
while(node!= null &&count<15)
{
System.out.println("data:"+node.data);
node = node.next;
count++;
}
}
}
}