Java单向链表中newlink.next操作原理及节点本质的技术疑问
关于Java单向链表insertFirst方法与节点引用的疑惑解答
咱们先把核心概念掰清楚,再一步步拆解你的问题:
核心概念:链表节点是对象,first/next是对象引用
在Java里,Link类的实例是实实在在的对象,而first(MyLinkList里的成员)、newlink.next(Link类里的成员)这些变量,都是指向Link对象的引用——你可以把引用理解成“对象的地址标签”,通过它就能找到对应的对象。
拆解insertFirst中newlink.next = first的工作原理
咱们拿你代码里的main方法操作一步步看:
- 初始状态:创建
MyLinkList list后,list.first被初始化为null,这时候链表是空的,没有任何Link对象。 - 第一次调用
insertFirst(52):- 先创建
newlink:这是一个Link对象,data值为52,它的next成员默认是null。 - 执行
newlink.next = first:此时first是null,所以这句就是把newlink的next引用设置为null(表示这个节点是链表最后一个)。 - 然后
first = newlink:把list.first这个引用指向刚创建的52节点,现在链表的头节点就是52的节点。
- 先创建
- 第二次调用
insertFirst(78):- 创建
newlink:这是一个data为78的Link对象,next默认null。 - 执行
newlink.next = first:此时first是指向52节点的引用,所以这句是让78节点的next引用指向52的节点——相当于把新节点和原来的链表头连起来了。 - 然后
first = newlink:把list.first更新为指向78的节点,现在78节点成了新的链表头,链表结构变成78节点 -> 52节点 -> null。
- 创建
解释newlink.next/first.next这类操作的本质
newlink.next = xxx:本质是给Link对象的成员变量赋值——Link类里定义了Link next这个成员,它是一个Link类型的引用变量,这句就是把xxx这个引用(可以是指向某个Link对象的引用,也可以是null)赋值给newlink对象的next成员,让newlink的next指向对应的对象。first.next:本质是获取Link对象的成员变量值——先通过first引用找到它指向的Link对象,然后取出这个对象的next成员的值(也就是另一个引用,可能指向某个节点或者是null)。
验证你的代码运行结果
你的main方法最后System.out.println(list)会调用MyLinkList的toString方法,遍历链表从first(78节点)开始,依次拼接节点的字符串,所以输出是{78}{52},完全符合咱们上面的分析。
内容的提问来源于stack exchange,提问作者Ananya
相关产品推荐
相关产品推荐

