链表删除倒数第n个节点:n等于链表长度时无法返回head.next
问题分析与修复
核心问题:未更新链表的head引用
你的RemoveNthNode方法在删除头节点(也就是n等于链表长度的情况)时,确实正确返回了head.next作为新的头节点,但在main方法调用时,没有把这个返回值赋值给链表对象的head成员变量。原链表的head还是指向旧的头节点,所以打印结果完全没变化——这就是你遇到的问题根源。
其他需要修复的小问题
PrintLL逻辑错误:当链表只剩一个节点时,会直接输出"NULL"而不显示节点数据;遍历结束后也没补打"NULL",输出格式不完整。- 边界判断缺失:没处理空链表、
nth为0或大于链表长度的非法输入场景,容易引发异常。
修复后的完整代码
class Main{ static class Node { int data; Node next; Node(int data){ this.data = data; this.next = null; } } Node head = null; public void addFirst(int data) { Node newnode = new Node(data); if(head == null){ head = newnode; return; } newnode.next = head; head = newnode; } // 修复后的打印方法 public void PrintLL() { Node n = head; if (n == null) { System.out.println("NULL"); return; } while(n != null){ System.out.print(n.data + " --> "); n = n.next; } System.out.println("NULL"); // 末尾补全NULL,格式统一 } // 修复后的删除倒数第n个节点方法 public Node RemoveNthNode(Node head, int nth){ // 处理空链表或非法n值 if(head == null || nth <= 0){ return head; } // 单节点链表处理 if(head.next == null){ return nth == 1 ? null : head; } int size = 0; Node curNode = head; while(curNode != null){ curNode = curNode.next; size++; } // n超过链表长度时不做处理 if(nth > size){ return head; } if(nth == size){ return head.next; } Node prevnode = head; int i = 1; // 定位到要删除节点的前一个节点 while(i < size - nth){ prevnode = prevnode.next; i++; } prevnode.next = prevnode.next.next; return head; } public static void main(String[] args) { Main ll = new Main(); ll.addFirst(90); ll.addFirst(40); ll.addFirst(45); System.out.println("删除前的链表:"); ll.PrintLL(); // 关键:把方法返回的新head赋值给链表的head成员 ll.head = ll.RemoveNthNode(ll.head, 3); System.out.println("\n删除后的链表:"); ll.PrintLL(); } }
关键修复说明
- 更新head引用:在
main里调用RemoveNthNode后,必须将返回值赋值给ll.head,这样链表的头节点才会被真正更新,删除头节点的操作才能生效。 - 修复打印逻辑:调整
PrintLL的判断顺序,先检查链表是否为空;遍历结束后添加"NULL",保证所有场景下的输出格式一致。 - 补全边界处理:增加对空链表、非法n值、n超出链表长度的处理,避免代码运行时出现异常。
内容的提问来源于stack exchange,提问作者rushi
相关产品推荐
相关产品推荐

