You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:35:44