Java 中链表元素的成对交换2025年5月13日 | 阅读 9 分钟 成对交换链表节点是指在不改变节点值的情况下,交换列表中相邻的节点。目标是重新排列列表,使每两个连续的节点交换位置,同时保持列表的整体顺序。 此操作可以通过递归或迭代来完成,需要仔细处理指针以避免破坏列表结构。 示例 1:偶数个节点 输入: 10 → 20 → 30 → 40 → 50 → 60 输出: 20 → 10 → 40 → 30 → 60 → 50 解释
示例 2:奇数个节点 输入: 5 → 15 → 25 → 35 → 45 输出: 15 → 5 → 35 → 25 → 45 解释
方法:使用递归递归方法首先将第二个节点设为新的头部,然后对剩余的列表递归调用函数来交换相邻节点。交换完成后,新头节点的 next 指针会指向第一个节点,确保正确链接。 算法步骤 1: 如果链表为空或只有一个节点,则返回头节点,因为不需要交换。 步骤 2: 将第二个节点存储为 newHead,然后递归调用 函数,从第三个节点开始交换剩余节点。 步骤 3: 将第一个节点的 next 指针设置为递归调用返回的头节点,从而将其链接到更新后的子列表。 步骤 4: 将 newHead(第二个节点)的 next 指针设置为第一个节点,完成前两个节点的交换。 步骤 5: 由于第二个节点现在是修改后列表的第一个节点,因此返回 newHead 作为更新后链表的新的头节点。 实施文件名: PairwiseSwap.java 输出 Original List: 1 2 3 4 5 List after pairwise swap: 2 1 4 3 5 时间复杂度: O(N) → 我们遍历列表一次,在每一步执行常数时间的操作。 辅助空间复杂度: O(N) → 由于递归,调用栈使用的空间与列表中节点的数量成正比。 解释 这个 Java 程序使用递归方法交换单链表的相邻节点。ListNode 类定义了节点的结构,而 swapPairs 方法执行交换。如果列表为空或只有一个节点,则按原样返回。否则,它将第二个节点设为新的头部,并递归地交换剩余的列表。 原始的第一个节点被链接到交换后的部分,完成交换。displayList() 方法在交换前后打印列表,main 方法初始化列表并调用 swap 函数来演示其功能。 方法:使用迭代法迭代方法通过维护一个虚拟节点并迭代更新指针来交换相邻节点。它在循环中处理节点对,调整链接以确保正确重新排序,而无需使用递归。 算法步骤 1: 如果列表为空或只有一个节点,则不需要交换,因此只需返回列表的头节点,不做任何更改。 步骤 2: 初始化一个虚拟节点以简化逻辑,并将 prev 指向虚拟节点,以跟踪在交换节点对之前该节点。 步骤 3: 当至少有两个节点可以交换时,迭代遍历列表,并对每对相邻节点执行交换操作。 步骤 4: 交换节点后,更新指针,使 prev.next 指向第二个节点,first.next 指向第二个节点后面的节点,second.next 指向第一个节点。 步骤 5: 所有节点对都交换完成后,返回 dummy.next 作为修改后列表的新头部,因为虚拟节点用于处理列表开头的交换。 实施文件名: PairwiseSwap.java 输出 Original List: 1 2 3 4 5 List after pairwise swap: 2 1 4 3 5 解释 这个 Java 程序实现了一种迭代方法来交换单链表的相邻节点。它首先定义了一个 ListNode 类来表示每个节点,以及一个 swapPairs 方法来执行交换。引入了一个虚拟节点来处理边缘情况,而 prev 指针则跟踪要交换的每个节点对之前的节点。 该方法遍历列表,系统地更新指针以交换相邻节点。此外,displayList 方法在交换前后打印列表。这种方法有效地处理了偶数和奇数长度的列表,确保未配对的节点保持不变。 方法:通过更改链接该方法通过修改链接而非值来交换相邻节点,使用了三个指针(prev、curr、newHead)。它遍历列表,为每对节点更新链接,并在交换后返回新的头部。 算法步骤 1: 如果列表为空或只有一个节点,则返回头节点,因为不需要交换。 步骤 2: 将 prev 设置为 null,curr 设置为 head,newHead 设置为 head.next,用于跟踪交换后的新头部。 步骤 3: 当存在两个节点时,更新第二个节点的 next 指向第一个节点,第一个节点的 next 指向下一个未交换的节点。 步骤 4: 如果存在前一个节点,则将其 next 指向交换对的第二个节点,以保持正确的顺序。 步骤 5: 将 prev 移至 curr,将 curr 移至下一个未交换的节点,直到列表末尾。 实施文件名: PairwiseSwapLinks.java 输出 Original List: 1 2 3 4 5 List after pairwise swap: 2 1 4 3 5 时间复杂度: O(N) (每个节点被访问一次,并在常数时间内交换) 辅助空间复杂度: O(1) (除了指针外,不使用额外的空间) 解释 这个 Java 程序通过修改链接而不是值来交换单链表的相邻节点。 ListNode 类定义了节点的结构,而 swapPairs 方法则迭代地成对交换节点。 它维护三个指针:prev(前一个节点)、curr(当前节点)和 newHead(将成为交换后列表的新头部)。在每次迭代中,重新排列相邻节点之间的链接以实现交换,同时保持其余节点的顺序。 displayList() 方法在交换前后打印列表,main 方法初始化链表并调用 swap 函数来演示转换。 下一个主题Java 中的 CRC 程序 |
在本节中,我们将学习什么是数组的平衡索引以及如何通过 Java 程序找到平衡索引。平衡索引 如果较低索引元素的总和等于较高索引元素的总和,则称为平衡索引...
阅读 4 分钟
“省份数量”问题涉及查找表示为无向图节点的连通城市组。一个城市组(省份)包括直接或间接连接的城市。此 Java 程序使用深度优先搜索 (DFS) 或并查集等算法来识别和计算这些连通...
阅读 13 分钟
在 Java 中,设计原则是在设计决策中用作规则的一组建议。在 Java 中,设计原则与设计模式的概念类似。设计原则和设计模式之间的唯一区别是设计原则更具通用性...
5 分钟阅读
在本节中,我们将学习 Java 中的房屋编号。它是一个由边长为 s+1 的立方体组成的数字。在这个立方体上,我们有一个边长为 s 的平方金字塔数。下图描绘了...
阅读 6 分钟
给定字符串 str,我们的任务是编写一个 Java 程序来确定提供的字符串是否为 pangram(全字母句)。如果字符串不区分大小写(大写或小写)而包含所有字母字符,则该字符串称为……
阅读 6 分钟
Sun Microsystems 于 1995 年创建了 Java,作为一种高级、面向对象的编程语言。随着时间的推移,Java 已发展成为最著名的 A 级语言之一。如今,它深受金融、科学和房地产行业的企业青睐。它开源、平台无关、适应性强且易于...
阅读 6 分钟
文本处理中的一个典型问题是字数统计。Java 多线程可以通过将任务分解成更小的部分并同时处理它们来极大地加快处理速度。在本节中,我们将讨论使用 Java 多线程进行字数统计的不同方法。使用……
阅读 8 分钟
给定一个十六进制数 N,将其转换为相应的二进制编码的十进制数是任务。示例 1:输入:String str = "2A3" 输出:等效的 BCD 是 0010 1010 0011 说明:2 的二进制:0010 A 的二进制:1010 3 的二进制:0011 因此,等效的 BCD 是 0010 1010 0011。示例……
阅读 6 分钟
尤其是在应用程序中,管理时间和日期是 Java 中一项非常常见的任务。JDK 8 包含时间包,其中包含用于处理时间和日期的类集。其中,LocalTime 类特别创建用于...
5 分钟阅读
java.nio.DoubleBuffer 包含 hasArray() 函数。 DoubleBuffer 类用于验证提供的缓冲区是否由可以访问的浮点数组支持。如果可访问此缓冲区的后备数组,则返回 true;否则返回 false。 array() 和 arrayOffset()...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India