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

判断链表有无环的方法:

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


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

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


所以设置快指针速度为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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值