今天思考单向链表如何添加的问题时,一直纠结其原理,先上代码
//定义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;
}
/**
* 2.
* temp = temp.next;
* 第一个temp是刚创建的虚拟头节点,指向的是head,是刚上面创建的空的东西,现在把上一步过程1中的temp.next = heroNode;
* 赋给了现在的temp,当这里跳出时,temp已经不再指向head了,现在指向heroNode1 在下面再次赋值
*/
temp = temp.next;
}
/**
* 1.
* 当数据添加的时候,第一步走这里,上面的while循环会跳出,因为没有next
* 这里是把第一个heroNode heroNode1 = new heroNode(1, "张三", "哎"); add进了链表中
* temp.next = heroNode;
* temp是虚拟头结点,next是heroNode中的属性,类型为heroNode,heroNode这里指heroNode1
* 穿起来的意思就是,temp的next属性,指向了了heroNode1的地址
*
*
* 3.
* 这里再次赋值
* temp.next = heroNode;
* temp是heroNode1,中的属性next,指向了引入的形参,也就是heroNode heroNode2 = new heroNode(2, "李四", "看");
* heroNode2
* 往下都是这个流程 当heroNode为空就跳出循环了
*/
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的情况