方法一:利用空间
遍历链表,对于每个节点对象,新增属性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;
};
本文介绍两种检测链表中是否存在环的方法:一是利用空间,在每个节点新增属性标记已访问;二是使用快慢指针,快指针每次走两步,慢指针每次走一步,若有环则最终会相遇。第一种方法的时间复杂度为O(n),空间复杂度为O(n);第二种方法的时间复杂度同样为O(n),但空间复杂度降低到O(1)。

350

被折叠的 条评论
为什么被折叠?



