用于在不交换数据的情况下交换链表中的节点的 JavaScript 程序
在不交换数据的情况下交换链表中的节点的 JavaScript 程序是 Web 开发中的一个常见问题,涉及重新排列链表中的节点顺序。链表是一种由节点组成的数据结构,每个节点包含一条数据和对列表中下一个节点的引用。
在本文中,我们将学习有关在不使用 JavaScript 交换数据的情况下交换链表中的节点的完整教程。因此,让我们首先定义交换节点,然后继续本教程。所以,继续学习!
交换节点
交换链表中的节点意味着我们交换两个节点的位置。有多种方法可以交换链表中的节点。一种方法是交换节点中的数据,但在处理大量数据时,这可能效率低下。另一种方法是交换节点的指针。这更有效,因为我们不需要复制任何数据。
让我们通过一个例子来了解交换节点
示例
假设我们有一个如下所示的链接列表 -
1 -> 2 -> 3 -> 4 -> 5
我们想要交换第二个和第四个节点以获得:
1 -> 4 -> 3 -> 2 -> 5
为了在不交换节点中数据的情况下完成此操作,我们需要修改节点之间的链接。生成的链表应该具有与原始链表相同的数据,但节点的顺序发生了变化。
因此,我们首先确定要交换的两个节点:节点 2 和节点 4。我们还需要跟踪列表中这些节点之前和之后的节点。
本例中,节点2之前和之后的节点分别为1和3。节点4之前和之后的节点分别是3和5。
接下来,我们需要更新节点之间的链接。我们首先将节点 2 之前的节点的下一个指针设置为节点 4。然后,我们将节点 2 的下一个指针设置为节点 5(因为节点 4 现在位于节点 2 之后)。最后,我们将节点 4 的下一个指针设置为节点 3(因为节点 2 现在位于节点 4 之后)。
生成的链接列表如下所示 -
1 -> 4 -> 3 -> 2 -> 5
注意 - 每个节点中的数据没有改变,只是节点的顺序。
现在让我们看看我们将用于在不交换数据的情况下交换链表中的节点的算法。
算法
STEP1:识别需要交换的两个节点
第一步是识别需要交换的两个节点。假设我们要交换节点 A 和节点 B。
第2步:找到要交换的两个节点的前一个节点
我们需要找到链表中节点 A 和 B 之前的节点。我们分别将这些节点称为 PrevA 和 PrevB。
第3步:更新前一个节点的next指针指向另一个节点
现在,我们需要更新 PrevA 和 PrevB 的 next 指针以指向正确的节点。这涉及更新 PrevA 的 next 指针以指向节点 B,以及更新 PrevB 的 next 指针以指向节点 A。
第4步:更新要交换的节点的next指针,使其指向正确的节点
接下来,我们需要更新节点 A 和 B 的 next 指针以指向正确的节点。这涉及到更新节点 A 的 next 指针以指向节点 B 的下一个节点,以及更新节点 B 的 next 指针以指向节点 A 的下一个节点。
第 5 步:对需要交换的任何其他节点重复上述步骤
如果我们需要交换两个以上的节点,我们可以对每对需要交换的节点重复上述步骤。
完成这些步骤后,链表中的节点将被交换,但不会交换其数据。现在让我们通过一个使用 Javascript 实现该算法的示例来理解上述算法。
示例
在这个程序中,我们首先定义一个“Node”类来创建链表的节点,并定义一个“LinkedList”类来创建和操作链表。 “LinkedList”类中的“swapNodes”函数实现了前面描述的交换算法。
// Define a Node class to create nodes of linked list class Node { constructor(data) { this.data = data; this.next = null; } } // Define a LinkedList class to create and manipulate the linked list class LinkedList { constructor() { this.head = null; } // Function to swap two nodes in the linked list swapNodes(node1, node2) { // If both nodes are the same, no need to swap if (node1 === node2) { return; } // Find the previous nodes of both nodes to be swapped let prevNode1 = null; let currentNode1 = this.head; while (currentNode1 && currentNode1 !== node1) { prevNode1 = currentNode1; currentNode1 = currentNode1.next; } let prevNode2 = null; let currentNode2 = this.head; while (currentNode2 && currentNode2 !== node2) { prevNode2 = currentNode2; currentNode2 = currentNode2.next; } // If either node1 or node2 is not found, return if (!currentNode1 || !currentNode2) { return; } // Update the next pointers of the previous nodes to point to the other node if (prevNode1) { prevNode1.next = currentNode2; } else { this.head = currentNode2; } if (prevNode2) { prevNode2.next = currentNode1; } else { this.head = currentNode1; } // Swap the next pointers of the nodes to be swapped to point to the correct nodes let temp = currentNode1.next; currentNode1.next = currentNode2.next; currentNode2.next = temp; // Print the swapped linked list console.log("Swapped linked list:"); let current = this.head; while (current) { process.stdout.write(current.data + " -> "); current = current.next; } console.log("null"); } // Function to add a Node at the end of the linked list addNode(data) { let node = new Node(data); if (!this.head) { this.head = node; } else { let current = this.head; while (current.next) { current = current.next; } current.next = node; } } } // Create a linked list let linkedList = new LinkedList(); linkedList.addNode(1); linkedList.addNode(2); linkedList.addNode(3); linkedList.addNode(4); // Print the original linked list console.log("Original linked list:"); let current = linkedList.head; while (current) { process.stdout.write(current.data + " -> "); current = current.next; } console.log("null"); // Swap node 2 and node 4 let node2 = linkedList.head.next; let node4 = linkedList.head.next.next.next; linkedList.swapNodes(node2, node4);
结论
在本教程中,我们展示了一个实现该算法的 JavaScript 程序,它成功地交换了链表中的节点,而无需交换其数据。希望对我们的读者有所帮助。快乐学习!
以上是用于在不交换数据的情况下交换链表中的节点的 JavaScript 程序的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

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

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

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

Dreamweaver CS6
视觉化网页开发工具

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

热门话题

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

本文讨论了使用浏览器开发人员工具的有效JavaScript调试,专注于设置断点,使用控制台和分析性能。

本文说明了如何使用源地图通过将其映射回原始代码来调试JAVASCRIPT。它讨论了启用源地图,设置断点以及使用Chrome DevTools和WebPack之类的工具。

掌握了入门级TypeScript教程后,您应该能够在支持TypeScript的IDE中编写自己的代码,并将其编译成JavaScript。本教程将深入探讨TypeScript中各种数据类型。 JavaScript拥有七种数据类型:Null、Undefined、Boolean、Number、String、Symbol(ES6引入)和Object。TypeScript在此基础上定义了更多类型,本教程将详细介绍所有这些类型。 Null数据类型 与JavaScript一样,TypeScript中的null

本文探讨了Java收藏框架的有效使用。 它强调根据数据结构,性能需求和线程安全选择适当的收集(列表,设置,地图,队列)。 通过高效优化收集用法

本教程将介绍如何使用 Chart.js 创建饼图、环形图和气泡图。此前,我们已学习了 Chart.js 的四种图表类型:折线图和条形图(教程二),以及雷达图和极地区域图(教程三)。 创建饼图和环形图 饼图和环形图非常适合展示某个整体被划分为不同部分的比例。例如,可以使用饼图展示野生动物园中雄狮、雌狮和幼狮的百分比,或不同候选人在选举中获得的投票百分比。 饼图仅适用于比较单个参数或数据集。需要注意的是,饼图无法绘制值为零的实体,因为饼图中扇形的角度取决于数据点的数值大小。这意味着任何占比为零的实体
