今天思考单向链表如何添加的问题时,一直纠结其原理,先上代码
//定义hearNode,每个HearNode对象就是一个节点
class heroNode{
public int no;
public String name;
public String nickName;
public heroNode next; //指向下个节点
@Override
public String toString() {
return "heroNode{" +
"no=" + no +
", name='" + name + ''' +
", nickName='" + nickName +
'}';
}
public heroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
}
以上是实体类,最后的next类型为对象类型,指向下个节点用的
//定义SingleLinkedList管理我们的英雄
class SingleLinkedList{
//先初始化一个头结点,头结点不要动
private heroNode head = new heroNode(0,"","");
public heroNode getHead() {
return head;
}
//添加结点到单向链表
public void add(heroNode heroNode){
//添加结点到单向链表
//思路:当不考虑编号顺序时
//1.找到当前链表的最后结点
//2.将最后这个结点的next指向新的节点
heroNode temp = head;
while (true){
if (temp.next == null){
break;
}
temp = temp.next;
}
temp.next = heroNode;
}
我一直疑惑于,为什么每次temp的next指向了新的节点,head的next也会指向这个节点
原因是:在SingleLinkedList类中初始化head节点的时候,会把这个对象放入堆内存,head是这个堆内存的地址,把head赋值给temp,也就是把堆内存的地址给了temp,所以在操作temp的时候,实际上就是在操作堆内存中的对象。
public class SingleLinkedListDemo {
public static void main(String[] args) {
//进行测试
//先创建节点
heroNode heroNode1 = new heroNode(1, "张三", "哎");
heroNode heroNode2 = new heroNode(2, "李四", "看");
heroNode heroNode3 = new heroNode(3, "王五", "啊");
heroNode heroNode4 = new heroNode(4, "赵六", "是");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.add(heroNode1);
singleLinkedList.add(heroNode2);
singleLinkedList.add(heroNode3);
singleLinkedList.add(heroNode4);
// singleLinkedList.addByOrder(heroNode1);
// singleLinkedList.addByOrder(heroNode4);
// singleLinkedList.addByOrder(heroNode2);
// singleLinkedList.addByOrder(heroNode3);
singleLinkedList.update(new heroNode(2,"saber","咖喱棒"));
singleLinkedList.list();
最后这里每次调用add方法的时候,不会重新创建head节点,直接调用add方法,所以不存在next为null的情况



