真题描述:给定一个链表,判断链表中是否有环。

示例 1: 输入:[3,2,0,4](链表结构如下图) 输出:true 解释:链表中存在一个环

环形链表-列表是否有环 - 图1

插旗法

思路:走一步立一个flag,当有一个flag存在时该链表就有环

  1. /**
  2. * @param {ListNode} head
  3. * @return {boolean}
  4. */
  5. // 入参是头结点
  6. const hasCycle = function(head) {
  7. // 只要结点存在,那么就继续遍历
  8. while(head){
  9. // 如果 flag 已经立过了,那么说明环存在
  10. if(head.flag){
  11. return true;
  12. }else{
  13. // 如果 flag 没立过,就立一个 flag 再往
  14. 下走
  15. head.flag = true;
  16. head = head.next;
  17. }
  18. }
  19. return false;
  20. };

快慢指针

  1. /**
  2. * @param {ListNode} head
  3. * @return {boolean}
  4. */
  5. // 入参是头结点
  6. const hasCycle = function(head) {
  7. let fast = head
  8. let slow = head
  9. // 只要结点存在,那么就继续遍历
  10. while(fast && fast.next){
  11. slow = slow.next
  12. fast = fast.next.next
  13. if(slow == fast) return true;
  14. }
  15. return false;
  16. };