22.链表中环的入口结点
给定一个链表,若其中包含环,则输出环的入口节点。
若其中不包含环,则输出null。
数据范围:
- 节点 val 值取值范围 [1,1000]。
- 节点 val 值各不相同。
- 链表长度 [0,500]。
样例:
给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。
则输出环的入口节点3.
代码:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
class Solution {
public ListNode entryNodeOfLoop(ListNode head) {
// 定义哈希表,用于判断是否存在环
Set<ListNode>set = new HashSet<>();
//定义节点,用于表示链表开始入环的第一个节点,如果无环,则为null
ListNode p = null;
//遍历链表
while(head!=null){
//如果当前节点在哈希表中已经存在,说明出现了环,将p指向当前节点,退出循环
if(set.contains(head)){
p = head;
break;
}
//将当前节点加入哈希表
set.add(head);
//当前节点向后移
head = head.next;
}
//返回结果
return p;
}
}