JS算法-环形链表2

简介: JS算法-环形链表2

题目


给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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


题解


第一种


我们这里采用的是快慢指针的方法,假设有两个指针:一个指针slow每次走一步,另一个指针fast每次走两步。如果链表中存在环,那么经过一些循环之后,快指针总会追上慢指针。在此期间,如果慢指针到达链表末尾,那么意味着链表无环。首先,如果链表为空或只有一个节点,就可以直接返回null。然后,设定fast和slow指针初始位置都为head。在while循环中,每次快指针fast向前移动两个位置,慢指针slow向前移动一个位置。如果存在环,最终快指针一定会追上慢指针并相遇。如果快指针和慢指针没有相遇,就代表链表中不存在环,直接返回null。接着,将慢指针slow重新指向head,然后再次进行循环,每次将快指针和慢指针都向前移动一个位置,直到它们相遇,相遇点就是链表中的环的连接点。最后返回该连接点。

var detectCycle = function(head) {
      if(!head || !head.next) return null;
      let fast = head;
      let slow = head;
      while(fast && fast.next){
          fast = fast.next.next;
          slow = slow.next;
          if(fast == slow){
              break;
          }
      }
      if(fast != slow){
          return null;
      }
      slow = head;
      while(slow != fast){
          fast = fast.next;
          slow = slow.next;
      }
      return slow;
  };


第二种


判断链表头结点是否为空或者链表只有一个结点,如果是则直接返回空。利用Set数据结构,创建一个保存链表结点的集合nodeSet,同时定义一个变量length用来保存nodeSet集合的大小。在while循环中,遍历链表,如果nodeSet不存在当前结点则把当前结点加入nodeSet集合中,同时将length设为nodeSet集合的大小,如果当前结点已经存在于nodeSet集合中,则说明链表有环,返回当前结点。如果遍历完整个链表都没有发现有环的结点,则返回null。

  var detectCycle = function(head) {
      var result = null;
      if(head === null || head.next === null){
          return result;
      }
      var nodeSet = new Set();
      var length = 0;
      while(head !== null){
          length = nodeSet.size;
          nodeSet.add(head);
          if(length === nodeSet.size){
              result = head;
              break;
          }
          head = head.next;
      }
      return result;
  };
相关文章
|
8天前
|
运维 监控 JavaScript
内网网管软件中基于 Node.js 的深度优先搜索算法剖析
内网网管软件在企业网络中不可或缺,涵盖设备管理、流量监控和安全防护。本文基于Node.js实现深度优先搜索(DFS)算法,解析其在网络拓扑遍历中的应用。通过DFS,可高效获取内网设备连接关系,助力故障排查与网络规划。代码示例展示了图结构的构建及DFS的具体实现,为内网管理提供技术支持。
32 11
|
5天前
|
监控 网络协议 算法
基于问题“如何监控局域网内的电脑”——Node.js 的 ARP 扫描算法实现局域网内计算机监控的技术探究
在网络管理与安全领域,监控局域网内计算机至关重要。本文探讨基于Node.js的ARP扫描算法,通过获取IP和MAC地址实现有效监控。使用`arp`库安装(`npm install arp`)并编写代码,可定期扫描并对比设备列表,判断设备上线和下线状态。此技术适用于企业网络管理和家庭网络安全防护,未来有望进一步提升效率与准确性。
23 8
|
27天前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
86 29
|
3天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
12 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
27天前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
94 25
|
2月前
|
JavaScript 算法 安全
深度剖析:共享文件怎么设置密码和权限的 Node.js 进阶算法
在数字化时代,共享文件的安全性至关重要。本文聚焦Node.js环境,介绍如何通过JavaScript对象字面量构建数据结构管理文件安全信息,包括使用`bcryptjs`库加密密码和权限校验算法,确保高效且安全的文件共享。通过实例代码展示加密与权限验证过程,帮助各行业实现严格的信息资产管理与协作。
|
2月前
|
存储 监控 算法
局域网网络管控里 Node.js 红黑树算法的绝妙运用
在数字化办公中,局域网网络管控至关重要。红黑树作为一种自平衡二叉搜索树,凭借其高效的数据管理和平衡机制,在局域网设备状态管理中大放异彩。通过Node.js实现红黑树算法,可快速插入、查找和更新设备信息(如IP地址、带宽等),确保网络管理员实时监控和优化网络资源,提升局域网的稳定性和安全性。未来,随着技术融合,红黑树将在网络管控中持续进化,助力构建高效、安全的局域网络生态。
56 9
|
3月前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
62 7
|
2月前
|
存储 监控 JavaScript
深度探秘:运用 Node.js 哈希表算法剖析员工工作时间玩游戏现象
在现代企业运营中,确保员工工作时间高效专注至关重要。为应对员工工作时间玩游戏的问题,本文聚焦Node.js环境下的哈希表算法,展示其如何通过快速查找和高效记录员工游戏行为,帮助企业精准监测与分析,遏制此类现象。哈希表以IP地址等为键,存储游戏网址、时长等信息,结合冲突处理与动态更新机制,确保数据完整性和时效性,助力企业管理层优化工作效率。
35 3
|
4月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!