嗨?,欢迎回到链接列表的这个系列。在上一篇文章中,我们了解了链表的基础知识,包括它们的定义、术语、与数组的区别以及链表的类型。我承诺我们会更深入地研究链表的实现,所以让我们开始吧。
课程大纲
- 简介
-
实现单链表
- 创建新节点
- 插入开头
- 插入末尾
- 删除节点
- 搜索节点
- 遍历列表
- 结论
介绍
正如我们在上一篇文章中了解到的,链接列表是编程世界中的基本数据结构。它们由节点组成,其中每个节点包含数据和对序列中下一个节点(在单链表中)或下一个和上一个节点(在双向链表中)的引用(或链接)。与数组不同,链表不会将元素存储在连续的内存位置,从而允许高效的插入和删除。
理解链表的概念对于掌握数据结构和算法至关重要。在本文中,我们将从单链表的基础知识开始,深入探讨链表的实现。
实现单链表
单链表是最简单的链表类型,其中每个节点都指向序列中的下一个节点。就像下图一样。
现在,是时候开始实现我们的单链表基本操作了。我们可以吗?
创建新节点
让我们从创建一个新的 Node 类开始。 Node 类将有一个构造函数,用于接收节点的数据和一个初始设置为 null 的下一个指针。
// Node class for Singly Linked List class Node { constructor(data) { this.data = data; this.next = null; } }
这个新创建的 Node 类(代表链表中的一个节点)可以如下图所示。
在继续之前,让我们创建一个 SinglyLinkedList 类的新实例来保存我们的链表操作。
// Singly Linked List class class SinglyLinkedList { constructor() { this.head = null; } // Operations come here ? }
在开头插入
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Insert at the beginning insertAtBeginning(data) { const newNode = new Node(data); // Create a new node with the given data newNode.next = this.head; // Set the new node's next pointer to the current head this.head = newNode; // Update the head to be the new node } // Other operations come here ? // . // . // . }
说明:插入到开头就像新人插在最前面一样。他们成为新的第一人称,链接到之前的第一人称。
在末尾插入
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Insert at the end insertAtEnd(data) { const newNode = new Node(data); // Create a new node with the given data // check if the list does not have a head i.e the list is empty // NOTE: Every non-empty linked list will have a head if (!this.head) { this.head = newNode; // If the list is empty, set the new node as the head return; } let current = this.head; // Start at the head of the list while (current.next) { current = current.next; // Move to the next node in the list by updating the current node } current.next = newNode; // Set the next pointer of the last node to the new node } // Other operations come here ? // . // . // . }
说明:在末尾插入就像有人在最后加入队伍一样。我们需要走到最后找到最后一个人,然后将他们链接到新的人。
删除节点
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Delete a node deleteNode(data) { if (!this.head) return; // If the list is empty, do nothing if (this.head.data === data) { this.head = this.head.next; // If the node to delete is the head, update the head to the next node return; } let current = this.head; while (current.next) { if (current.next.data === data) { current.next = current.next.next; // If the node to delete is found, update the next pointer to skip it return; } current = current.next; } } // Other operations come here ? // . // . // . }
说明:删除一个节点就像队伍中间的某个人决定离开。我们找到那个人并将他们之前的人与他们之后的人联系起来。
搜索节点
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . // Search note search(data) { let current = this.head; // Start at the head of the list while (current) { if (current.data === data) { // If the data is found, return true return true; } current = current.next; // Move to the next node } return false; } // Other operations come here ? // . // . // . }
解释: 搜索节点就像尝试在队列中查找特定的人。我们从前面开始询问每个人,直到找到他们或到达终点。
遍历列表
class SinglyLinkedList { constructor() { this.head = null; } // Previous `SinglyLinkedList` class codes here ? // . // . // . traverse() { let current = this.head; // Start at the head of the list while (current) { console.log(current.data); // Print the data of the current node current = current.next; // Move to the next node } } } // End of class
说明:穿越就像沿着队伍走并问候每个人。我们从前面开始,一直前进,直到到达终点。
结论
在本文中,我们了解了链表的基本操作以及如何在 JavaScript 中实现它们。在下一篇文章中,我们将学习双向链表。
记住,掌握链表需要练习。继续解决问题并在各种场景中实现这些数据结构。
保持更新和联系
确保您不会错过本系列的任何部分,并与我联系以更深入地讨论软件开发(Web、服务器、移动或抓取/自动化)、数据结构和算法以及其他令人兴奋的技术主题,请关注我:
- GitHub
- 领英
- X(推特)
敬请期待并祝您编码愉快????
以上是如何在 JavaScript 中实现单向链表的详细内容。更多信息请关注PHP中文网其他相关文章!

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Atom编辑器mac版下载
最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。