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

链表节点交换(仅修改链接)实现异常,请求排查原因

链表节点交换问题排查与修复

问题根源分析

你的代码无法实现交换的核心原因有两个:

  • 第二个循环完全未执行:第一个while(temp.Next!=null)循环结束后,temp已经指向链表的最后一个节点(它的Next为null),因此第二个循环的条件temp.Next!=null直接不成立,交换逻辑根本没运行。
  • 未记录目标节点的前驱节点:交换链表节点的关键是修改「指向目标节点的前驱节点的Next指针」,但你的代码只保存了目标节点本身和它们的后继节点,没有保存前驱节点,就算循环能执行,也无法正确修改链表的链接关系。

修正后的代码实现

下面是修复后的代码,仅通过修改链表链接实现节点交换,同时考虑了头节点等特殊情况:

public void question1(int key1, int key2) {
    // 如果两个key相同,无需交换
    if (key1 == key2) return;

    Node prev1 = null, curr1 = Head;
    Node prev2 = null, curr2 = Head;

    // 找到key1对应的前驱节点和当前节点
    while (curr1 != null && curr1.data != key1) {
        prev1 = curr1;
        curr1 = curr1.Next;
    }

    // 找到key2对应的前驱节点和当前节点
    while (curr2 != null && curr2.data != key2) {
        prev2 = curr2;
        curr2 = curr2.Next;
    }

    // 如果其中一个key不存在,直接返回
    if (curr1 == null || curr2 == null) return;

    // 情况1:key1对应的节点是头节点
    if (prev1 == null) {
        Head = curr2;
    } else {
        prev1.Next = curr2;
    }

    // 情况2:key2对应的节点是头节点
    if (prev2 == null) {
        Head = curr1;
    } else {
        prev2.Next = curr1;
    }

    // 交换两个节点的后继指针
    Node tempNext = curr1.Next;
    curr1.Next = curr2.Next;
    curr2.Next = tempNext;
}

public static void main(String args[]) {
    LinkedList ll = new LinkedList();
    ll.addFirst(1);
    ll.addFirst(2);
    ll.addFirst(3);
    ll.addFirst(4);
    ll.addFirst(5);
    ll.addFirst(6);
    ll.Print();
    ll.question1(3, 2);
    ll.Print();
}

代码说明

  1. 遍历查找节点:两次遍历分别找到两个目标节点的前驱(prev1/prev2)和自身(curr1/curr2),确保后续能修改前驱的Next指针。
  2. 特殊情况处理:如果其中一个节点是头节点,直接修改Head指针,避免空指针异常。
  3. 交换链接:先修改前驱节点的Next指向,再交换两个节点的后继指针,完成节点位置的交换。

测试结果

运行修正后的代码,输入链表6 5 4 3 2 1,调用question1(3,2)后,输出为预期的6 5 4 2 3 1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:55:32