1. Основные сведения об этом вопросе
Связанный список
2. Описание заголовка
Для связанного списка, если он содержит кольцо, найдите входной узел кольца связанного списка, в противном случае выведите ноль.
3. Идеи решения проблем
- Обойти каждый узел односвязного списка
- Если текущий адрес узла не отображается в наборе, он сохраняется в наборе.
- Если он отображается в Set, текущий узел является входным узлом кольца.
- После обхода всего односвязного списка, если он не отображается в наборе, кольцо отсутствует.
4. Код
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
HashSet<ListNode> set = new HashSet<>();
// 遍历单链表的每个结点
while (pHead != null) {
if (set.contains(pHead)) {
// 出现在 Set 中,则当前结点就是环的入口结点
return pHead;
} else {
// 如果当前结点地址没有出现在 Set 中,则存入 Set 中
set.add(pHead);
pHead = pHead.next;
}
}
// 整个单链表遍历完,若没出现在 Set 中,则不存在环
return null;
}
}