求环状链表-快慢指针法

74 阅读1分钟

求环状链表

leetcode题目

题目描述:

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意: pos ****不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

解题思路

使用快慢指针法,指的是fast和slow指针;fast移动2步,slow移动一步;fast和slow在途中相遇,代表这个链表有环

   const hasCycle=function(head){
      let fast=slow=head;
      while(fast&&fast.next){
         fast=fast.next.next;
         slow=slow.next
         if(fast==slow){
            return true;
         }
      }
      return false
   }

总结

快慢指针的应用场景

  • 判断链表是否有环
    • 使用快慢指针算法,fast总是比slow快,当有环的时候,fast和flow总会相遇,因为fast最终会在环中等待和slow相遇,fast总是有next。
  • 找到链表的中间节点
    • 使用快慢指针算法可以很容易地找到链表的中间节点。
    • 原理也很简单:因为快指针走得快,所以当快指针到达链表的尾部时,慢指针刚好走了一半。
  • 找到链表的倒数第 k 个节点
    • 先让快指针先走 k 步,然后让慢指针和快指针一起移动,当快指针到达链表末尾时,慢指针就指向了倒数第 k 个节点。