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

链表删除倒数第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();
    }
}

关键修复说明

  1. 更新head引用:在main里调用RemoveNthNode后,必须将返回值赋值给ll.head,这样链表的头节点才会被真正更新,删除头节点的操作才能生效。
  2. 修复打印逻辑:调整PrintLL的判断顺序,先检查链表是否为空;遍历结束后添加"NULL",保证所有场景下的输出格式一致。
  3. 补全边界处理:增加对空链表、非法n值、n超出链表长度的处理,避免代码运行时出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:50:29