public class FindCircleBeginning {
class ListNode {
public int id;
public ListNode next;
public ListNode() {
}
public ListNode(int id, ListNode next) {
this.id = id;
this.next = next;
}
}
public ListNode createList(int n) {
ListNode head = new ListNode(0,null);
ListNode p = head;
for (int i = 1; i <= n; ++i) {
ListNode tmp = new ListNode(i,null);
p.next = tmp;
p = tmp;
}
return head;
}
/**
* @param n 链表总长度
* @param m 环所在的位置,head为0,不计算入内,所以长度为n的链表位置分别为1-n
* @return
*/
public ListNode createList(int n, int m) {
if (m >= n || m <= 0) {
System.out.println("Cannot creat a linkedlist with a circle!");
return null;
}
ListNode head = new ListNode(0,null);
ListNode p = head;
for (int i = 1; i <= n; ++i) {
ListNode tmp = new ListNode(i,null);
p.next = tmp;
p = tmp;
}
ListNode q = head;
for (int i = 1; i <= m; ++i) {
q = q.next;
}
p.next = q;//加环
return head;
}
/**
* @param head 链表的头指针
* 为防止有环存在的链表无线循环下去,设定了limit长度为展示总长度
*/
public void displayList(ListNode head) {
int limit = 100;
int i = 0;
while (head.next != null && ++i <= limit) {
System.out.print(head.id + "->");
head = head.next;
}
if (i > limit) {
System.out.println();
System.out.println("Maybe there exists a circle in the linkedlist.");
} else {
System.out.println("null");
}
}
public ListNode findCircle(ListNode head) {
if (head == null) {
return null;
}
ListNode fast = head.next;
ListNode slow = head.next;
boolean hasCircle = false;
while (true) {
if (fast.next != null && slow.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
} else {
break;
}
if (slow == fast) {
hasCircle = true;
break;
}
}
if (hasCircle) {
slow = head.next;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
} else {
System.out.println("NO circle.");
return null;
}
}
public static void main(String[] args) {
FindCircleBeginning fcb = new FindCircleBeginning();
ListNode ln = fcb.createList(7,5);
fcb.displayList(ln);
ListNode circlebeginNode = fcb.findCircle(ln);
if (circlebeginNode != null) {
System.out.println("Circle begins at " + circlebeginNode.id);
}
}
}