一、带环链表与非带环链表
一般不带环的链表的尾结点都是指向Null,带环链表的尾结点指向的是前面当中的某个结点(如果尾结点指向头结点,此链表为循环链表)。两种如下图所示。
二、实现思路
- 快慢指针
- 先定义快慢两个指针,slow和fast,慢指针每次走一步,快指针每次走2步,如果此链表中存在环,fast指针会率先进入,slow会后进入,则在某个时刻两个指针一定会重合。
- 使用Set集合
- 从头结点遍历链表,遍历时先检验当前结点在Set集合中是佛存在,如果不存在则放入set集合中,进入下次循环。如果存在则代表此链表有环。
三、代码实现
- 快慢指针实现
public boolean checkCircle_1(Node head) {
if(head == null) return false;
Node slow = head;//慢指针
Node fast = head;//快指针
while (fast != slow) {
if (fast == null || fast.next == null) {
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
2. Set集合实现
public boolean checkCircle_2(Node head) {
if(head == null) return false;
Set<Node> nodeSet = new HashSet<>();
Node curr = head;
boolean result = false;
while (curr != null) {
if (nodeSet.contains(curr)) {
result = true;
break;
}
nodeSet.add(curr);
curr = curr.next;
}
return result;
}