环形链表
链表的结尾不是空地址,而是链表中的某个节点,称为环形链表。
思路一:快慢指针
在链表中定义两个指针,同时遍历整个链表,一个一次走一步,另一个一次走两步 例:链表a = 1->2->3->4->5->2(此时是链表第二位的那个2), 从链表头开始遍历,快指针走两步,慢指针走一步。
- 慢=2,快=3
- 慢=3,快=5
- 慢=4,快=3
- 慢=5,快=5 此时经过四次移动,快慢指针相遇了。可得当前是环形链表。
思路一:JS代码实现
var hasCycle = function(head) {
if(!head) return false;// 如果链表为空,返回false
let p = head;// 慢指针
let q = head;// 快指针
while (q && q.next) { // 判断链表和链表节点下一位是否存在,如果还有值就继续循环
p = p.next;// 慢走一步
q = q.next.next;// 快走两步
if(q === p) return true;// 如果快慢指针相等了,代表链表有环,结束循环。
}
return false;// 如果走到这里代表q或者q.next 为空了,代表链表没环
};