LeetCode刷题,环形链表(141)

1,551 阅读1分钟

环形链表

链表的结尾不是空地址,而是链表中的某个节点,称为环形链表。

思路一:快慢指针

在链表中定义两个指针,同时遍历整个链表,一个一次走一步,另一个一次走两步 例:链表a = 1->2->3->4->5->2(此时是链表第二位的那个2), 从链表头开始遍历,快指针走两步,慢指针走一步。

  1. 慢=2,快=3
  2. 慢=3,快=5
  3. 慢=4,快=3
  4. 慢=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 为空了,代表链表没环
};