对于链表添加操作,假如不考虑按序号添加,则可以写一个简单的方法:

public void add(HeroNode heroNode) {

        //因为head节点不能动,因此我们需要一个辅助变量遍历
        HeroNode temp = head;
        //遍历链表,找到最后
        while (true) {
            //找到链表的最后
            if (temp.next == null) {
                break;
            }
            //没有找到最后,就讲temp后移
            temp = temp.next;
        }
        //当退出while循环时,temp就指向了链表的最后
        temp.next = heroNode;
    }

这里可能存在一个疑问:局部变量temp在出栈以后就被JVM垃圾回收了,那

temp.next = heroNode;

这句代码中间的细节如何理解?

可以画出JVM的栈结构和堆结构来阐明:

单向链表为什么要用一个辅助变量遍历_垃圾回收

HeroNode temp = head;

只是创建了一个局部变量temp,局部变量在Java中均存放于栈中,其指向了堆空间中的head(head在属性处直接初始化了)。此时temp.next就是head.next,即Node1。所以,temp.next = heroNode也就是把此时堆中对象的指针指向了传入的形参heroNode。所以即便temp被JVM回收,依然完成了辅助创建指针的作用。