给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

版权声明: 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;
    }

猜你喜欢

转载自blog.csdn.net/if_i_were_a/article/details/89155061