算法练习(7)-判断单链表是否有环,以及求环的长度

如上图,一个单链表,如何判断有没有环? 如果有,如何求环的长度?

如果面试时,遇到这个题目,先喝口水压压惊,回想一下,咱们小时候念小学时,数学老师最喜欢的一类题目:

跑道上,2个运动员,1个速度是3m/s,1个速度是5m/s,同一起点起跑后,多久运动员2会再次遇到运动员1?是不是感觉异曲同工? 这2个速度不同的运动员,相当于就是快/慢2个指针

@Data
class Node {
    private String value;
    private Node next;

    public Node(String value) {
        this.value = value;
    }
}

@Test
public void isLoopLink() {
    Node a = new Node("a");
    Node b = new Node("b");
    Node c = new Node("c");
    Node d = new Node("d");
    a.next = b;
    b.next = c;
    c.next = d;
    d.next = b;

    int loopSize = 0, meetCount = 0;
    Node slow = a, fast = a;
    while (slow.next != null) {
        fast = fast.next.next;
        slow = slow.next;
        if (fast == null || slow == null) {
            System.out.println("it is not a loop link");
            break;
        }
        if (fast.value.equalsIgnoreCase(slow.value)) {
            //首次相遇
            meetCount += 1;
            if (meetCount > 1) {
                //再次相遇
                System.out.println("it is a loop link,loopSize:" + loopSize);
                break;
            }
        }
        if (meetCount == 1) {
            //首次遇到后,开始数环的节点个数
            loopSize += 1;
        }
    }
}

 

posted @ 2021-03-27 16:49  菩提树下的杨过  阅读(194)  评论(0编辑  收藏  举报