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

链表i、j位置节点交换实现遇编译错误求助

搞定链表节点交换的编译错误与逻辑问题

嘿,我来帮你梳理下你遇到的问题,分两部分解决:

先解决编译错误:找不到val变量

你看到的cannot find symbol: variable val错误,原因很简单:要么你的LinkedListNode类里的val字段不是public权限,要么类里根本没直接暴露val,而是用了getVal()这类 getter 方法。

  • 如果是权限问题:把LinkedListNode里的val字段改成public就行;
  • 如果是用getter:把代码里的node1.val换成node1.getVal(),node2.val换成node2.getVal()。

更重要的:你的逻辑完全搞错了!

需求是交换索引i和j位置的节点,但你现在的代码是在找值等于i和值等于j的节点,这完全不是一回事啊!比如预期输出是3 4 5 6 2 1 9,假设原链表是3 4 5 6 1 2 9,要交换的是第4和第5个位置的节点(对应值1和2),而不是找值为4和5的节点。

修正后的完整代码

下面是符合需求的实现,我已经处理了所有边界情况(比如交换头节点、相邻节点、索引超出范围等),还内置了LinkedListNode类解决编译问题:

public class Solution {
    public static LinkedListNode<Integer> swap_nodes(LinkedListNode<Integer> head, int i, int j) {
        // 索引相同无需交换
        if (i == j) {
            return head;
        }

        LinkedListNode<Integer> prev1 = null, curr1 = head;
        LinkedListNode<Integer> prev2 = null, curr2 = head;
        int count = 0;

        // 定位索引i的节点及其前驱
        while (curr1 != null && count != i) {
            prev1 = curr1;
            curr1 = curr1.next;
            count++;
        }

        // 重置计数器,定位索引j的节点及其前驱
        count = 0;
        while (curr2 != null && count != j) {
            prev2 = curr2;
            curr2 = curr2.next;
            count++;
        }

        // 若任一索引超出链表长度,直接返回原链表
        if (curr1 == null || curr2 == null) {
            return head;
        }

        // 处理curr1是头节点的情况
        if (prev1 == null) {
            head = curr2;
        } else {
            prev1.next = curr2;
        }

        // 处理curr2是头节点的情况
        if (prev2 == null) {
            head = curr1;
        } else {
            prev2.next = curr1;
        }

        // 交换两个节点的后继指针
        LinkedListNode<Integer> temp = curr1.next;
        curr1.next = curr2.next;
        curr2.next = temp;

        return head;
    }

    // 辅助打印链表的方法
    public static void printLinkedList(LinkedListNode<Integer> head) {
        LinkedListNode<Integer> curr = head;
        while (curr != null) {
            System.out.print(curr.val + " ");
            curr = curr.next;
        }
        System.out.println();
    }

    // 定义LinkedListNode类(如果你的类结构不同,调整访问方式即可)
    static class LinkedListNode<T> {
        public T val;
        public LinkedListNode<T> next;

        public LinkedListNode(T val) {
            this.val = val;
            this.next = null;
        }
    }

    public static void main(String[] args) {
        // 构建测试链表:3 -> 4 -> 5 -> 6 -> 1 -> 2 -> 9
        LinkedListNode<Integer> head = new LinkedListNode<>(3);
        head.next = new LinkedListNode<>(4);
        head.next.next = new LinkedListNode<>(5);
        head.next.next.next = new LinkedListNode<>(6);
        head.next.next.next.next = new LinkedListNode<>(1);
        head.next.next.next.next.next = new LinkedListNode<>(2);
        head.next.next.next.next.next.next = new LinkedListNode<>(9);

        System.out.println("原链表:");
        printLinkedList(head);

        // 交换索引4和5的节点(对应值1和2)
        head = swap_nodes(head, 4, 5);

        System.out.println("交换后的链表:");
        printLinkedList(head);
        // 输出结果:3 4 5 6 2 1 9
    }
}

小提醒

如果你的LinkedListNode类不是用public的val字段,而是用了getter/setter(比如getVal()、setNext()),记得把代码里访问val和next的地方替换成对应的方法哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:01:48