84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
たくさん話したので記憶力が悪いので、そのとき何を聞いたか忘れてしまいました。 おそらく「鎖にループがあるかどうかの判定方法」だったと思います 意味はうろ覚えですが... ご協力ありがとうございます質問を修正させていただきます。主に何が質問されているのか知りたいのです。
这个问的有点厉害
var a = { val: 'a' }, b = { val: 'b' }, c = { val: 'c' }; a.next = b; b.next = c; c.next = a;
a.next 是 bb.next 是 cc.next 是 a..... .....
a.next
b
b.next
c
c.next
a
如果执行以下循环
var temp = a; while(tamp){ temp = temp.next; }
那么将会是个死循环,temp会被如下赋值: a => b => c => a => b ..... 这样的 abc 就是构成了一个环
a => b => c => a => b .....
abc
你可以参考一下循环队列,环链表。
既然他说要我判断,按照上面的做法。
递归
function isCircle(list, head){ // 默认值 head = head || list; if (list.next === head){ // 相等 console.log('是循环的'); return true; } else if (!list.next) { // 下一个? 不存在的 console.log('不是循环的'); return false; } else { // 继续递归 return isCircle(list.next, head); } }
(写完发现写错又重写... = = 抱歉了)
这道题目是一个非常经典的算法题,最经典的做法是使用 快慢指针法 ,具体题目可以移步 leetcode
快慢指针法
简单来说,定义快指针和慢指针,快的一次走两步,慢的一次走一步,如果他们两个能相遇,则说明有环。
var hasCycle = function(head) { if(!head) return false; var faster = head; var slower = head; while (faster && faster.next) { faster = faster.next.next; slower = slower.next; if (slower === faster) return true; } return false; };
这个问的有点厉害
a.next
是b
b.next
是c
c.next
是a
..... .....
如果执行以下循环
那么将会是个死循环,temp会被如下赋值:
a => b => c => a => b .....
这样的abc
就是构成了一个环你可以参考一下循环队列,环链表。
那么到底要如何判断呢?
既然他说要我判断,按照上面的做法。
递归
ScreenShot
(写完发现写错又重写... = = 抱歉了)
这道题目是一个非常经典的算法题,最经典的做法是使用
快慢指针法
,具体题目可以移步 leetcode简单来说,定义快指针和慢指针,快的一次走两步,慢的一次走一步,如果他们两个能相遇,则说明有环。