环形链表⚡⚡⚡
环形链表I🚀🚀🚀
题目传送门:环形链表I (opens new window)
题意:给你一个链表,你需要去判断一下这个链表有没有环。
想法:💦💦💦
判断一个链表有没有环,只需要判断我们有没有重复走这个链表的某个节点就好,那怎么判断有没有重复走过这个位置呢?
Tips:链表是一个对象,是对象就可以挂载其他的属性,
比如挂载一个flag来表示这个走过没有,
如果走过了,那很明显,有环,为true;
如果没走过,那就无环咯🐠🐠🐠
AC代码:
var hasCycle = function(head) {
while(head){
if(head.flag) return true;
else{
head.flag = true;
head = head.next;
}
}
return false;
};
怎么样?这道easy确实给我们做出了easy的感觉。
再来看看下面这个medium !
环形链表II
题目传送门:环形链表II (opens new window)
题意:给你一个链表,让你返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
思路:🐧🐧🐧
这道题有两种做法,
一种是上文中提到的flag标记法,
flag标记法极其轻便快捷
var detectCycle = function(head) {
cnt = 0
while(head){
if(head.flag){
// console.log('返回索引为 '+ head.index +' 的链表节点');
return head;
return 0;
}
else{
head.flag = true;
head = head.next;
// head.index = cnt;
// cnt++;
}
}
// console.log('返回 null');
return null;
};
BUT!!!
你用不了啊(bushi
看看题目怎么说的:
不允许修改链表! (他真的,我哭死-----这么简单的方法不能用
好了,别哭了,快来看看第二种方法!
快慢指针做法:
使用快慢指针法来做就很好做
假设:链表的长度为 a(链) + b (环)
fast = 2 * slow & fast = slow + n * b
所以 slow = n * b
当 fast 和 slow 碰面的时候,只需要让slow再走a个步子就可以了。
var detectCycle = function(head) {
let slow = head;
let fast = head;
while(true){
if(fast === null || fast.next === null){
return null;
}
slow = slow.next;
fast = fast.next.next;
if(slow === fast){
break;
}
}
let newHead = head;
while(newHead !== slow){
newHead = newHead.next;
slow = slow.next;
}
return slow;
};
好啦!
讲到这里就讲完啦,大家记得下去自己实操一遍嗷!
纸上得来终觉浅,不如回去敲代码!
码字不易~
能给个赞嘛✨✨✨