版权声明: https://blog.csdn.net/if_i_were_a/article/details/89155061
这是LeetCode上面的142题,同时也是剑指offer上的一个题
整体思想:当判断完当前链表有环之后,先确定环的个数,确定完之后,让前面的指针开始先跑n个节点,然后两支针一起跑,两个指针相等的那个位置就是环形链表的入口节点
代码如下:
public static ListNode detectCycle(ListNode head) {
if (head == null || head.next == null)
return null;
//先判断链表是否有环
ListNode p = head.next, q = head;
while (p != q) {
if (p == null || p.next == null)
return null;
else {
p = p.next.next;
q = q.next;
}
}
//从这个循环出来,说明链表是一个有环的链表
//求出这个环中链表的个数
//默认个数是1,因为p从q的next开始跑的
//这里加一个虚拟的指针比较好理解
int k = 1;
ListNode tempHead = new ListNode("0");
tempHead.next = head;
for (p = q.next; p != q; p = p.next, k++) ;
for (p = tempHead; k != 0; p = p.next, k--) ;
for (q = tempHead; q != p; p = p.next, q = q.next) ;
return p;
}