求环状链表
题目描述:
给你一个链表的头节点 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 个节点。