链表节点交换(仅修改链接)实现异常,请求排查原因
链表节点交换问题排查与修复
问题根源分析
你的代码无法实现交换的核心原因有两个:
- 第二个循环完全未执行:第一个
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(); }
代码说明
- 遍历查找节点:两次遍历分别找到两个目标节点的前驱(
prev1/prev2)和自身(curr1/curr2),确保后续能修改前驱的Next指针。 - 特殊情况处理:如果其中一个节点是头节点,直接修改
Head指针,避免空指针异常。 - 交换链接:先修改前驱节点的
Next指向,再交换两个节点的后继指针,完成节点位置的交换。
测试结果
运行修正后的代码,输入链表6 5 4 3 2 1,调用question1(3,2)后,输出为预期的6 5 4 2 3 1。
内容的提问来源于stack exchange,提问作者Anurag Verma
相关产品推荐
相关产品推荐

