【算法刷题】链表是否有环且输出入环节点--缓存记录法(JAVA)

【题目】LeetCode 142 linked-list-cycle II(环形链表)

【题址】https://leetcode-cn.com/problems/linked-list-cycle-ii/

【题干】

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

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

说明:不允许修改给定的链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1

输出:tail connects to node index 1

解释:链表中有一个环,其尾部连接到第二个节点。


示例 2:
输入:head = [1,2], pos = 0

输出:tail connects to node index 0

解释:链表中有一个环,其尾部连接到第一个节点。
 

示例 3:
输入:head = [1], pos = -1

输出:no cycle

解释:链表中没有环。
【思路】

 遍历一遍链表,每项均添加入缓存set中,判断是否遍历过此节点确定是否有环,若有环返回此节点,若无环返回null

【程序】

	/**
	 * @author 白雪红叶约 2019.05.01 
	 * 【题目】142. linked-list-cycle-ii(链表是否有环,并输出入环节点) 
	 * 【思路】缓存记录法。
	 *         遍历一遍链表,每项均添加入缓存set中,判断是否遍历过此节点确定是否有环,若有环返回此节点,若无环返回null
	 * 【时间复杂度】O(n) 
	 * 【空间复杂度】O(n)
	 * @param head 原始链表头结点
	 * @return <ListNode> 入环节点或null
	 */
	public ListNode detectCycle2(ListNode head) {
		Set<ListNode> cacheSet = new HashSet<ListNode>();
		while (!cacheSet.contains(head)) {
			if (head == null)
				return null;
			cacheSet.add(head);
			head = head.next;
		}
		return head;
	}

【图解】

以 head = [1,2,3,4,5,6], pos = 3为例

(0)初始化缓存空间(set)

Set<ListNode> cacheSet = new HashSet<ListNode>();

【算法刷题】链表是否有环且输出入环节点--缓存记录法(JAVA)

(1-6)逐个遍历节点,并判断是否遍历过,若没遍历过则将其加入缓存

【算法刷题】链表是否有环且输出入环节点--缓存记录法(JAVA)

(7)遍历节点,发现若之前遍历过,则直接返回结果

【算法刷题】链表是否有环且输出入环节点--缓存记录法(JAVA)