之前看到的各种教程,都说链表的前一个节点的指针域指向后一个节点,那这里指向是啥意思?
因为楼主本人比较执拗,所以的东西要有自己的理解方式才能记得住,才能转化和运用,所以不想别人说啥就记啥,故用程序打印的方式来一探究竟
程序用了3个类,一个节点类(有点JavaBean实体类的意思,用来存数据的),一个链表的操作类,一个测试类。
节点类:
public class Node {
public int data;
public Node next; //指针都是Node类型的,所以后面让指针指向下一个节点的时候,可以直接 前节点.next = 后节点
public Node() {
}
public Node(int data){
this.data=data;
}
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
链表操作类
(实现方式无关紧要,只要是用来创造一个链表和打印链表而已,各种条件就不管了)
public class SingleLink {
public Node head;
public void insert(Node node){ //前面插入
if(head==null) {
head = node; //直接让head指针指向刚传入的node节点
}else {
node.next = head;
head = node;
}
}
public void read(){
System.out.println("头指针"+head);
System.out.println("头节点数据: "+head.data);
System.out.println("指针域"+head.next);
System.out.println(" ");
Node indexNode ;
for(int i = 0;i<6;i++){
indexNode = head.next;
System.out.println("节点数据: "+indexNode.data);
System.out.println("指针域"+indexNode.next);
System.out.println(" ");
head = indexNode;
}
}
}
测试类
public class TestSingleLink {
public static void main(String[] args) {
Node node1 = new Node(10);
Node node2 = new Node(5);
Node node3 = new Node(13);
Node node4 = new Node(15);
Node node5 = new Node(18);
Node node6 = new Node(1);
Node node7 = new Node(14);
System.out.println(node1);
System.out.println(node2);
System.out.println(node3);
System.out.println(node4);
System.out.println(node5);
System.out.println(node6);
System.out.println(node7);
System.out.println("正式打印");
SingleLink singleLink = new SingleLink();//要用其他类的方法,所以创建这个类的实例对象singleLink
singleLink.insert(node1);
singleLink.insert(node2);
singleLink.insert(node3);
singleLink.insert(node4);
singleLink.insert(node5);
singleLink.insert(node6);
singleLink.insert(node7);
singleLink.read();
}
}
打印结果
Day4.Node@1b6d3586 //“节点1”
Day4.Node@4554617c //“节点2”
Day4.Node@74a14482 //“节点3”
Day4.Node@1540e19d //“节点4”
Day4.Node@677327b6 //“节点5”
Day4.Node@14ae5a5 //“节点6”
Day4.Node@7f31245a //“节点7”
正式打印
头指针Day4.Node@7f31245a
头节点数据: 14
指针域Day4.Node@14ae5a5
节点数据: 1
指针域Day4.Node@677327b6
节点数据: 18
指针域Day4.Node@1540e19d
节点数据: 15
指针域Day4.Node@74a14482
节点数据: 13
指针域Day4.Node@4554617c
节点数据: 5
指针域Day4.Node@1b6d3586
节点数据: 10
指针域null
解析:其中,我们新建了7个节点,节点的值分别是10,5,13,15,18,1,14,循环链表的时候是从第7个开始的,也就是值是 ——>14——>1——>18——>15——>13——>5——>10——>null。
七个节点的本质就是一个地址,从上到下分别是节点1--节点7的地址
Day4.Node@1b6d3586 //节点1
Day4.Node@4554617c
Day4.Node@74a14482
Day4.Node@1540e19d
Day4.Node@677327b6
Day4.Node@14ae5a5
Day4.Node@7f31245a //节点7
然后我们打印的头指针,也就是指向第一个节点的指针,它的值是Day4.Node@7f31245a,链表的第一个节点(头节点,也就是“节点7”)的本质也是Day4.Node@7f31245a,所以教材上都是称为指针指向后面一个节点,这点我们从Node节点的本质来看也能看明白,因为Node类的next是Node类型的,整个节点也是Node类型的。
public int data;
public Node next;
所以可以这么说,链表的本质上是一个套娃的关系,即上一个节点有数据域和指针域,而指针域就是下一个节点,下个节点的指针域是下下个节点,如此套娃下去。
,如次也就能理解,头指针是整个头节点,所以新传进来一个node节点,将它插在链表前面的话,自然是head(头指针)等于整个节点了,
所以也就有这一句代码 head = node;
而,因为新插入的节点占据了第一个节点的位置,所以之前第一个位置的节点跑到第二了,也就是新的头节点的指针域将之前的头节点套娃了,所以头节点的指针域等于之前的节点。
即 node.next = head; //新进来的头节点的指针域,即node.next等于之前的头节点地址即head
head = node; //新的节点node成为头节点,所以链表的头指针指head向node。