package sort;
public class Test23 {
public static void main(String[] args) {
ListNode target = null;
ListNode head = new ListNode(1, null);
ListNode temp = head;
int count = 0;
for (int i = 2; i <= 100; i++) {// 认为构造了一个环,环的入口为22
if (temp.date == 22)
target = temp;
temp.next = new ListNode(i, null);
temp = temp.next;
}
temp.next = target;
System.out.println("设置的计入点是" + temp.next.date);
ListNode mn = MeetingNode(head);
ListNode tt = mn.next; //统计环内有多少节点
count++; //上一步得到的mn节点肯定在环内,所以从mn节点开始找下一个,直到
//到mn节点为止,就可统计环中节点个数。
while (tt != mn) {
tt = tt.next;
count++;
}
System.out.println("环内元素的个数" + count);
ListNode temp1 = head;
ListNode temp2 = head; //使用上一步结果,配合两指针
for (int i = 0; i < count; i++) {//快指针先走count步,而后与慢指针一起向前移动
temp1 = temp1.next; //直到他们再相遇时,节点就为入口节点
}
while (temp1 != temp2) {
temp1 = temp1.next;
temp2 = temp2.next;
}
System.out.println("结果算法找到的节点为" + temp1.date);
}
private static ListNode MeetingNode(ListNode head) {// 使用一个快指针和一个慢指针
// TODO Auto-generated method stub //快指针每次前进两步,慢指针每次前进一步
// 如果链表上有环,他们总会相遇,
ListNode slow = head; // 并且相遇点总在环内
ListNode fast = head.next.next;
while (fast.next != null && slow.next != null) {
if (fast == slow)
return fast;
slow = slow.next;
fast = fast.next;
if (fast.next != null)
fast = fast.next;
else
return null;
}
return null;
}
}