当前位置:网站首页>JS链表中的快慢指针
JS链表中的快慢指针
2022-07-24 05:17:00 【蛞蝓不孤寡】
快慢指针,顾名思义就是一快一慢的两个指针,判断链表是否有环的原理:如果链表中存在环,那么快慢指针在进入环后,因为存在速度差,两个指针迟早会相遇。
判断链表中是否有环
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
解题思路:利用快慢指针遍历数组,当快慢指针相遇时,则说明有环。
function hasCycle(pHead){
if(pHead == null || pHead.next == null){
return false
}
let fast = pHead
let slow = pHead
while(fast){
fast = fast.next.next
slow = slow.next
if(fast == slow){
return true
}
}
return false
}
求链表环入口
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
解题思路:利用快慢指针遍历数组,当快慢指针相遇时,将其中一个指针从链表头出发,另一个从相遇点出发,并将两个指针均改为每次只走一步,则再次相遇点即为环入口。
function hasCycle(pHead){
if(pHead == null || pHead.next == null){
return null
}
let fast = pHead
let slow = pHead
while(fast){
fast = fast.next.next
slow = slow.next
if(fast == slow){
var fast2 = pHead
while(fast2 != slow){
fast2 = fast2.next
slow = slow.next
}
return slow
}
}
return null
}
求链表最后K个节点
题目:输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
解题思路:使用快慢针,使快针每次走k步,慢针每次只走一步,当快针的值变成null时,那么慢针的值就是第k个节点。
function FindKthToTail( pHead , k ) {
let fast = pHead
let slow = pHead
while(k){
if(!fast) return fast
fast = fast.next
k--
}
while(fast){
slow = slow.next
fast = fast.next
}
return slow
}
当然,不用快慢指针也是可以的,例如:
function FindKthToTail(pHead, k)
{
var result = [];
while(pHead) {
result.unshift(pHead);
pHead = pHead.next
}
return result[k-1];
}
总结:
1、设置快慢指针,假如有环,他们最后一定相遇。
2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。
证明结论1:设置快慢指针fast和low,fast每次走两步,low每次走一步。假如有环,两者一定会相遇(因为low一旦进环,可看作fast在后面追赶low的过程,每次两者都接近一步,最后一定能追上)。
证明结论2:
设:
链表头到环入口长度为–a
环入口到相遇点长度为–b
相遇点到环入口长度为–c
则:相遇时
快指针路程=a+(b+c)k+b ,k>=1 其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,不然和慢指针走的一样长,矛盾)。
慢指针路程=a+b
快指针走的路程是慢指针的两倍,所以:
(a+b)*2=a+(b+c)k+b
化简可得:
a=(k-1)(b+c)+c 这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度。其中k>=1,所以k-1>=0圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。
边栏推荐
猜你喜欢

Some experience of using D2L package and related environment configuration

数据类型概括

OSS file upload

C语言从入门到入土——函数

C2 random generation function seed, numpy. Random. Seed(), TF. Random. Set_ Seed Learning + reprint and sorting

C语言进阶篇 六.文件的操作

深度剖析数据在内存中的存储

Tips for using the built-in variable vars in BeanShell

C语言入门篇 二.函数

C语言从入门到入土(二)
随机推荐
【Pytorch】conv2d torchvision.transforms
C#进程运行权限
special effects - 鼠标移动,出现泡泡拖尾
Basic usage of analog Addition & structure
JS - 计算直角三角形的边长及角度
libevent多线程服务端+客户端源码
gdb调试core/dump
赶紧进来!!轻松掌握C语言“顺序”、“分支”、“循环”三大结构
关键字_01return
Skills of BeanShell dealing with JSON
一步一步带你学C(其一)
跟李沐学ai 线性回归 从零开始的代码实现超详解
scikit-learn笔记
【sklearn】tree.DecisionTreeClassifier
Scikit learn notes
Text summary acl2021
在屏幕上绘制一个运动的茶壶,茶壶先慢慢向屏幕里面移动,越变越小,越变越模糊;然后慢慢变大,越变越清晰,一直往返重复。为场景添加光照,材质和雾效果。通过键盘’a’’s’’d’来选择不同的雾效模式
Solutions to MySQL remote connection errors
C语言入门篇 五.初识指针 六.初识结构体
一步一步带你学C(其二)