LeetCode链表两两交换节点:Java代码输出异常原因排查
问题分析与解决
你的代码得到[1,4,3]结果的核心原因有两个:
1. 未更新链表的头节点引用
第一次交换1和2后,真正的新头节点是原来的第二个节点(2),但你代码里的head仍然指向初始的1,最终遍历输出时是从1开始,而非新的头节点2。
2. 方法返回类型错误
LeetCode要求返回交换后的头节点,但你的方法是void类型,无法返回新的头节点,导致你只能用原始head获取结果,必然出错。
修正后的代码
public Node swapPairs(Node head) { // 空链表或仅有单个节点,直接返回原head if (head == null || head.next == null) { return head; } // 创建虚拟头节点,统一处理头节点与中间节点的交换逻辑 Node dummy = new Node(0); dummy.next = head; Node prev = dummy; // 确保存在两个可交换的相邻节点 while (prev.next != null && prev.next.next != null) { Node first = prev.next; // 当前组的第一个节点 Node second = prev.next.next; // 当前组的第二个节点 // 执行节点交换 first.next = second.next; // 第一个节点指向第二个节点的后继 second.next = first; // 第二个节点指向第一个节点 prev.next = second; // 前序节点指向交换后的第二个节点(成为当前组新的首节点) // 将prev移动到下一组的前序位置(当前组的第一个节点) prev = first; } // 返回虚拟头节点的后继,即交换后的新头节点 return dummy.next; }
关键修正点说明
- 虚拟头节点(dummy node):避免单独处理头节点的特殊场景,让所有节点的交换逻辑保持一致,降低出错概率。
- 返回新头节点:将方法改为返回
Node类型,最终返回dummy.next,也就是交换后的真正头节点。 - 循环条件优化:确保每次循环都有两个相邻节点可交换,避免空指针异常。
内容的提问来源于stack exchange,提问作者Strange Alchemist
相关产品推荐
相关产品推荐

