LeetCode题解:环形链表

环形链表

一、题目

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

解法一(快慢指针)

  • 一个有环的链表,比作一个环形跑道,跑的快的运动员迟早会再次和跑得慢的运动员相遇
  • 慢指针一次移动 1 位,快指针一次移动 2 位,快指针如果跑道了终点,证明无环,否则一定会相遇
  • 快指针比漫指针多走1位,不管成环的地方在哪里,两者一定会相遇

代码:

var hasCycle = function(head) {
  if (!head || !head.next) return false;
  var slow = head; //头节点
  var fast = head.next; // 头节点后的第一个节点
  while (slow != fast) {
    if (fast == null || fast.next == null) {
      return false; // fast走的快,有终点也是先一步到达终点
    }
    slow = slow.next; // 走一步
    fast = fast.next.next; // 走两步
  }
  return true;
};
结果

在这里插入图片描述

题解二 (set方法)

思路
  • 遍历链表,放入 set 结构中,如果已经存在,则证明有环
代码
var hasCycle = function(head) {
  var setBox = new Set();
  while (head != null) {
    if (setBox.has(head.next)) {
      return true;
    } else {
      setBox.add(head.next);
      head = head.next;
    }
  }
  return false;
};
结果

在这里插入图片描述

三、写在最后

本文是链表-双指针思路的第一题,通过指针速度差异,来达到验证目的。

如果对你有所帮助不妨给本项目的github 点个 star,这是对我最大的鼓励~

关于我

  • 花名:余光
  • WX:j565017805
  • 沉迷 JS,水平有限,虚心学习中

其他沉淀

相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页