You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

单链表表头前添加新节点的代码问题求助

问题排查与解决:单链表表头前添加节点无效

我来帮你拆解下这个问题~你代码里的核心问题出在表头节点的引用更新逻辑上:
当调用l.addAfter(null,500)时,方法内部确实创建了新节点newNode,并让它的next指向当前的this(也就是原来的链表头l),但这个操作并没有改变外部变量l的引用。Java是值传递,方法里的this是当前对象的引用副本,你只是给新节点的next赋值了原表头,却没让外部的l指向这个新节点,所以外部看来链表头还是原来的节点,输出自然没变化。

解决思路与修改方案

要让表头添加操作生效,我们需要让方法能把新的表头节点返回给调用者,让外部的链表头变量指向它。

修改后的代码

// Definition for singly-linked list.
public class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }

    // 修改方法为返回新的链表头节点
    public ListNode addAfter(ListNode thisnode, int x) {
        ListNode newNode = new ListNode(x);
        if(thisnode == null) {
            // 添加到表头前,新节点成为新表头
            newNode.next = this;
            return newNode; // 返回新的表头节点
        } else {
            // 原逻辑不变,添加到指定节点之后
            ListNode currentNext = thisnode.next;
            thisnode.next = newNode;
            newNode.next = currentNext;
            return this; // 表头未变,返回原表头
        }
    }
}

调用方式调整

现在调用时,需要把方法返回的新节点重新赋值给链表头变量:

// 假设原链表头是l
l = l.addAfter(null, 500);

这样外部的l就指向了新的表头节点500,后续遍历输出就能得到预期的500 2 100 300 800

更优雅的封装方案(可选)

如果不想每次调用都手动处理返回值,可以封装一个专门的链表类来管理头节点,内部直接修改头引用:

public class SinglyLinkedList {
    private ListNode head;

    // 构造方法、遍历方法等省略...

    // 直接在链表类中实现表头添加方法
    public void addBeforeHead(int x) {
        ListNode newNode = new ListNode(x);
        newNode.next = head;
        head = newNode;
    }

    // 原addAfter方法也可以整合到这里
}

这种方式更符合面向对象设计,能避免调用者手动维护头节点的麻烦。

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

火山引擎 最新活动