用打印的方式看清楚链表的头指针,头节点,指针与和数据域究竟是什么?

之前看到的各种教程,都说链表的前一个节点的指针域指向后一个节点,那这里指向是啥意思?

因为楼主本人比较执拗,所以的东西要有自己的理解方式才能记得住,才能转化和运用,所以不想别人说啥就记啥,故用程序打印的方式来一探究竟

程序用了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。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值