前端算法小白攻略1-leetcode环形链表

448 阅读1分钟

前言

对于我们算法小白来说,直接干题肯定有点迷,这里我稍微加入形象化思维,不喜勿喷。

解题思路:

题目:141.环形链表--给你一个链表的头节点 head ,判断链表中是否有环。

形象描述如下:

首先这是一个唯一指向的单向链表,用这条链表建个跑道,甲乙两个人从相同起点head处分别以1倍速和2倍速在上面跑步(假设甲1步一个节点,乙1步两个节点),如果甲乙一直跑下去能够再次相遇,那么说明这个跑道有环,如果跑得快的乙遇到了null点,那说明链表没有环;

混入逻辑解析:

  1. 想先起跑肯定head不为null点 =》if(!head) return false;
  2. 相同起点head处开跑 =》 let pre = head, cur = head;
  3. 想一直跑的话肯定得先保证跑得快的乙不会遇到null点 =》 while(cur && cur.next)(cur.next为真保证乙每一步都能跑成功,如果在跑的那步过程中即cur.next中到null点了也是提前结束比赛)
  4. pre代表跑得慢的甲1倍速 =》 pre = pre.next
  5. cur代表跑得快的乙2倍速 =》 cur = cur.next.next
  6. 一直跑的情况下如果甲乙跑到了相同节点地址即pre === cur那么说明甲乙相遇了,链表有环 =》if(pre === cur) return true;
  7. 如果甲乙无法一直跑,即乙先到了null点,那么终结比赛 =》return false;

完整代码示例: var hasCycle = function(head) {

if(!head) return false;
let pre = head,cur = head;
while(pre && cur && cur.next){
    pre = pre.next;
    cur = cur.next.next;
    if(pre === cur) {
        return true;
    }
}
return false;

};