用于查找链表中循环长度的 JavaScript 程序
在这个程序中,我们将得到一个可能包含循环的链表,我们必须找出循环是否存在,然后循环的大小是多少。让我们使用一个非常著名的方法来借助代码来查找循环的长度,并讨论其时间和空间复杂度。
问题简介
在这个问题中,正如我们上面所看到的,我们给出了一个链表,其中可能包含也可能不包含循环,如果循环存在,我们必须找到循环的长度,否则我们必须返回零,因为有不存在循环。我们将使用 Floyd 循环方法来查找循环,然后检查其大小。例如,如果我们给出一个链表 -
List: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
从包含 8 的节点到包含 4 的节点存在一个循环,这意味着 8 与 4 连接,形成长度为 5 的循环,我们必须检测它。
方法
在本题中,我们将使用Floyd循环方法来检测循环,然后我们将使用长度查找的概念来查找循环的长度。让我们首先看看问题的基本步骤,然后我们将转向弗洛伊德方法和长度方法。
首先,我们将创建一个类来提供链表节点的基本结构,并在其中定义构造函数来初始化节点值。
然后我们创建了一个函数来将元素推送到给定的链表中。
我们使用上面的方法创建了一个链表,然后将最后一个节点链接到另一个节点以在其中形成一个循环。
弗洛伊德算法
在这个算法中,我们遍历链表,一旦进入链表,就不能从任何节点出去。这意味着,如果我们在链表循环部分有两个指针,其中一个指针一次移动一个节点,另一个指针一次移动两个节点,它们将在某一点相遇。
实现算法后,我们将调用该函数并检查循环是否存在
如果存在循环,我们将调用 anther 函数来查找循环的长度。
另一方面,我们将返回并打印不存在循环。
示例
在下面的示例中,我们定义一个链表并向其中添加 8 个节点。我们通过将节点 8 连接到节点 4 来形成链表中的循环。因此,它形成了五个节点的循环。
// class to provide the structure to the linked list node class Node{ constructor(data) { this.value = data this.next = null; } } // function to add values in a linked list function push(data, head) { var new_node = new Node(data); if(head == null) { head = new_node; return head; } var temp = head while(temp.next != null) { temp = temp.next; } temp.next = new_node; return head; } // function to find the length in the loop function length(loop_node) { var count = 1; var temp = loop_node; while(temp.next != loop_node) { count++; temp = temp.next; } console.log("The length of the loop in the given linked list is: " + count); } // function to find the cycle in the given list // if the cycle is found then call the length function function find_node(head) { var slow_ptr = head; var fast_ptr = head; while(slow_ptr != null && fast_ptr != null && fast_ptr.next != null) { slow_ptr = slow_ptr.next; fast_ptr = fast_ptr.next.next; if(slow_ptr == fast_ptr) { length(slow_ptr); return; } } console.log("There is no loop present in the given linked list"); } var head = null; head = push(1,head) head = push(2,head) head = push(3,head) head = push(4,head) head = push(5,head) head = push(6,head) head = push(7,head) head = push(8,head) // making loop in a linked list by connecting 8 to four var temp = head; while(temp.value != 4){ temp = temp.next; } var temp2 = head; while(temp2.next != null){ temp2 = temp2.next } temp2.next = temp // finding the length of the loop find_node(head)
时间和空间复杂度
在上面的代码中,我们只遍历了完整的链表一次,循环部分最多遍历了三次,这使得时间复杂度是线性的。因此上述代码的时间复杂度是线性的,即 O(N),其中 N 是链表的大小。
由于我们没有使用任何额外的空间,使得程序的时间复杂度为 O(1)。
结论
在本教程中,我们学习了如何通过在 JavaScript 语言中实现概念来查找链表中存在的循环的长度。我们使用了 Floyd 的循环查找算法来查找给定链表中的循环,然后我们使用 while 循环来遍历循环并找到其长度。上述代码的时间复杂度为O(N),空间复杂度为O(1)。
以上是用于查找链表中循环长度的 JavaScript 程序的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。
