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

Java实现链表两两交换节点时出现溢出问题排查

解决链表两两交换节点时的溢出问题

嘿,我一眼就揪出导致溢出的元凶了——你的while循环后面多了个多余的分号!这直接引发了无限循环,最终耗尽资源触发溢出错误。

问题根源分析

先看你代码里的这段错误写法:

while(curr.next != null); {//while there is another point in the origina...

这里的分号;是致命错误:它让while循环的“循环体”变成了空语句,后面的大括号{}完全不会被执行。只要curr.next不为null,这个while就会一直空转,永远停不下来,最终导致栈溢出或内存溢出(本质是无限循环耗尽了JVM的资源)。

修正后的完整代码及逻辑说明

除了去掉多余的分号,我们还需要完善两两交换的指针逻辑,避免链表断链。下面是可以正常运行的完整实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        // 边界处理:空链表或只有单个节点,直接返回原链表
        if (head == null || head.next == null) return head;
        
        // 哑节点:简化头节点交换的特殊处理,让所有交换逻辑统一
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy; // 记录当前交换对的前一个节点
        
        // 循环条件:确保有两个节点可以交换
        while (head != null && head.next != null) {
            ListNode first = head;       // 第一个要交换的节点
            ListNode second = head.next; // 第二个要交换的节点
            
            // 核心交换操作:调整指针避免断链
            prev.next = second;    // 前一个节点指向第二个节点
            first.next = second.next; // 第一个节点指向第二个节点的下一个(下一组的起始)
            second.next = first;   // 第二个节点指向第一个节点,完成交换
            
            // 移动指针,准备处理下一组
            prev = first;
            head = first.next;
        }
        
        // 返回哑节点的下一个,即新的头节点
        return dummy.next;
    }
}

关键细节解释

  • 哑节点(dummy):不用单独处理头节点交换的特殊情况,让所有节点对的交换逻辑保持一致,代码更简洁。
  • 指针顺序:交换时必须先保存节点引用,再调整指针,否则会丢失链表的后续节点,导致断链。
  • 循环终止条件:head != null && head.next != null保证我们每次都有两个节点可以交换,避免空指针异常。

内容的提问来源于stack exchange,提问作者Omar Elhosseni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:00