您的位置:首页 > 其它

判断链表是否有环并求出环的起点

2016-06-14 10:28 295 查看
判断链表有无环的方法:

设置一个快指针速度  != 慢指针的速度,这就是物理里的相遇问题,我开始犯了一个错,我设置快指针和慢指针的速度相等,所以答案出错,原因是速度相等,那么它们在坐标轴上的速度永远是平行的,除非数组的长度很小,可以相遇一次,否则不能相遇。

如果快指针和慢指针相遇则有环。

求环的起点:当两指针相遇的时候,将快指针指向链表起点,并且速度设置为和慢指针速度相等,当两指针相遇的时候,此节点则是环的起点。

所以设置快指针速度为2,慢指针速度为1,只要不相等就可以,然后考虑边界问题,一般都是节点不为空。

下面是求解环的起点代码:

/**

 * Definition for singly-linked list.

 * class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) {

 *         val = x;

 *         next = null;

 *     }

 * }

 */

public class Solution {

    public ListNode detectCycle(ListNode head) {

        if(head == null || head.next == null)return null;

        ListNode node = head.next.next;//快指针

        ListNode p = head;

        head = head.next;//慢指针

        while(node != null && node.next != null){

            if(node == head){//判断快指针和慢指针是否相遇,如果两者指向同一个节点,则是有环,接下来快指针指向链表头结点,速度和慢指针相同

                while(p != node){//如果两个指针相同,则返回环的起点。

                    p = p.next;

                    node = node.next;

                    

                }

                return p;

            }

            head = head.next;

            node = node.next.next;

        }

        return null;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: