每天进步一点点

今天看到了这一题,很适合我这个小白

第一种思路

准备一个hashset,从头遍历链表,往hashset里放,放之前判断一下是否已经放过这个值,注意:判断的是内存地址,不是值,如果已经有这个值,说明链表有环,如果遍历到最后都没有,说明没有环
下面给出代码

public boolean Node isHaveLoop(Node head) {
    HashSet<Node> nodes = new HashSet<>();
    while (head != null) {
        if (nodes.contains(head)) {
            return true;
        }
        nodes.add(head);
        head = head.next;
    }
    return false;
}

第二种思路

快慢指针,这个思路就很妙了,定义两个指针,一个一次走一步,一个一次走两步,如果快指针可以走到结束,说明没有环,如果两个指针相遇,说明有环

public static boolean isHaveLoop(Node head) {
		if (head == null || head.next == null || head.next.next == null) {
			return false;
		}
		Node n1 = head.next; // n1 -> slow
		Node n2 = head.next.next; // n2 -> fast
		while (n1 != n2) {
			if (n2.next == null || n2.next.next == null) {
				return false;
			}
			n2 = n2.next.next;
			n1 = n1.next;
		}
		return true;
	}
posted on 2021-03-27 22:04  柯蓝僧人  阅读(63)  评论(0编辑  收藏  举报