链表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
相关产品推荐
相关产品推荐

