方法一:利用空间
遍历链表,对于每个节点对象,新增属性isVisited = true。同时每次遍历判断下一个节点是否拥有isVisited属性,如果有就是有环的。
- 时间复杂度O(n)
- 空间复杂度O(n)
var hasCycle = function(head) {
var curr = head;
while(curr != null) {
if(curr.next == null) {
return false;
}
if(curr.next.isCheck) {
return true;
} else {
curr.isCheck = true;
curr = curr.next;
}
}
return false;
};
方法二:快慢指针
用两个指针同时遍历链表,快指针每次走两步,慢指针每次走一步。如果链表中有环,那么他们终将相遇。
- 时间复杂度O(n)
- 空间复杂度O(1)
var hasCycle = function(head) {
var p1 = head;
var p2 = head;
while(p2 !== null && p2.next !== null) {
p1 = p1.next;
p2 = p2.next.next;
if(p1 === p2) {
return true;
}
}
return false;
};