环形链表,尝试立flag,秒解~

293 阅读1分钟

最近在看数据结构和算法,努力总结出道~

TL;DR

环形链表,每走一步,看看有没有标识过,标识过肯定是环,且从这里开始的环。没有就标识下,继续走~

练习:判断链表中是否有环

circle_list1

判断链表中是否有环,其实有点像四处游玩,怎么知道你走过一个圈,其实只要你第二次走到走过的地方,就说明走过一个圈了。

于是,每走过一个地方,就给这个地方标识下,如果再次看到这个标识表明这个地方游过,也就说明,走了一个圈。

var hasCycle = function (list) {
  let p = list
  while(p){
    // 遇到走过的,就有一个圈了
    if(p.flag) return true
    // 遇到没走过的,标记下,继续走
    p.flag = true
    p = p.next
    
  }
  return false
};

可以看下官方题解的其他方案,可以着重看看快慢指针

练习:环从哪开始的

circle_list2

可以沿用上面的思路,我觉得就没啥了

var detectCycle = function (list) {
  let p = list;
  while (p) {
    if (p.flag) return p
    p.flag = true
    p = p.next
  }
  return null;
};

官方其他解法,可以着重看下快慢指针

引用