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

Java自定义LinkedList类如何实现链表节点两两交换顺序?

两两交换节点实现方案

核心思路

  • 你触发空指针报错的核心原因是遍历逻辑未做有效边界判断,直接访问了null节点的next属性,结合你当前带哨兵头节点(LinkedList的first为固定null哨兵,first.next为第一个有效节点)的结构,按如下逻辑实现即可:
  1. 初始化两个指针:prev指向哨兵节点first,curr指向第一个有效节点first.next
  2. 循环终止条件设置为curr != null && curr.next != null,只要满足其一就停止循环,自动兼容奇数长度链表末尾节点不动的需求
  3. 每轮循环提前缓存当前组的第二个节点、下一组的起始节点,避免交换后指针丢失
  4. 完成节点交换后移动指针到下一组,重复操作直到循环终止
  5. 最后更新last指针即可补全链表属性维护逻辑

具体实现代码

将以下方法添加到LinkedList类中即可:

public void swapPairs() {
    LinkedListElement prev = first;
    LinkedListElement curr = first.next;

    // 循环条件保证当前处理组存在两个有效节点,避免空指针
    while (curr != null && curr.next != null) {
        // 提前缓存节点,避免交换后指针丢失
        LinkedListElement secondInCurrPair = curr.next;
        LinkedListElement firstInNextPair = secondInCurrPair.next;

        // 执行节点交换
        prev.next = secondInCurrPair;
        secondInCurrPair.next = curr;
        curr.next = firstInNextPair;

        // 指针移动到下一组
        prev = curr;
        curr = firstInNextPair;
    }

    // 维护last指针属性
    last = curr != null ? curr : prev;
}

常见空指针触发原因

绝大多数无法获取null的.next属性报错都来自以下两个问题:

  1. 循环条件仅判断了curr != null,未判断curr.next != null,当curr是链表最后一个节点时,访问curr.next就会触发空指针
  2. 未提前缓存下一组的起始节点,交换完当前组节点后指针指向混乱,后续遍历误访问null节点的next属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:03