随着学习的不断深入,开始学习数据结构这一门课程,链表是数据结构中关键的学习节点之一。在本篇文章中,我们会初步介绍链表以及链表的构造方法,了解其相关的功能,并以代码和图片的方式为大家展示,不足之处望大家给予指正,共同进步。
语法说明:链表实际上是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
语法上理解起来相对比较吃力,生活中可以举个例子来说明一下。大家可以依照火车来想象一下链表
火车都是由一节一节的车厢组成的,从而形成了一个完整的列车。链表也是如此,是由一个一个节点组成。
实际上链表的结构非常多,组合起来有8种的链表结构,在本篇我们主要介绍的是➡️单向不带头非循环链表⬅️
我们先画一个大致的图来简单介绍链表
这是一个单向不带头非循环链表,由四个节点组成,每个节点中分为2个部分,并且都是带值的,这些值代表的又是什么意思呢?
val是用来存储数据的
Next是用来存储下一个节点的地址
我们将0x12的位置的节点定义为head,也就是头节点。那么 head=0x12 head.val = 10 head.next = 0x66
需要先了解这些数值是什么意思,才能在后面的链表中理解其中的含义。
简单的介绍链表之后,我们来建立一个链表,并以代码的方式来呈现。
在建立一个链表之前我们需要建立一个静态内部类,在生成链表相关的对象时,可以不依赖于外部的对象。不加也是可以,看自己的项目需求。
public class MySingleList {
static class ListNode{
//静态内部类
public int val;//存储的数据
public ListNode next;//存储下一个节点的地址,目前是不知道下一个节点是什么
public ListNode(int val){
//构造方法
this.val=val;
}
}
public ListNode head;//代表当前链表的头节点的引用,所以是一个节点型的对象
//使用穷举的方式创建一个链表
public void createLink(){
ListNode listNode1 = new ListNode(12);
ListNode listNode2 = new ListNode(45);
ListNode listNode3 = new ListNode(23);
ListNode listNode4 = new ListNode(90);
//利用链式存储的方式将各个节点串联在一起,形成一个完整的链表
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
head = listNode1;
}
以上代码需要注意几点
完成了定义之后,就需要给val赋值了,我们分别给四个节点listnode1 listnode2 listnode3 listnode4 的val赋值,12 45 23 90。如下图
这是一个不完整的链表,并没有完全串联起来。这个时候就需要用到next了,我们在文章的开头说过,next是用来存储下一个节点的地址的。
每一个listNode都有属于自己的地址,我们通过赋值的方式从第二个节点开始,将自己的地址赋值给前一个节点的next;最后再将listNode1赋值给head,从而我们形成了一个完整的链表。
完整的链表结构⬇️
通过调试的方法也能看到目前是已经将4个节点都串联起来了,最后一个节点的next赋值为null,也就是空的意思,我们的链表是非循环的,所以需要赋值为null。
既然已经创建了一个链表,我们现在遍历打印出来。这里有2个很重要的条件,需要我们注意。
比方说我的头节点现在需要往后遍历了,那我现在的语法就是head=head.next,类似于++;那循环条件是什么呢?我们再看下链表的结构图
最后一张图,head已经来到了最后null,代表head.next== null,无法再打印出结果了,也就是head.next的位置,链表已经遍历完了。那循环的条件应该就是head.next!=null。
我们实现一个遍历链表
//方法
建立一个链表
public void createLink(){
//目前只有val有值,next目前没有值
ListNode listNode1 = new ListNode(12);
ListNode listNode2 = new ListNode(45);
ListNode listNode3 = new ListNode(23);
ListNode listNode4 = new ListNode(90);
//利用链式存储的方式将各个节点串联在一起,形成一个完整的链表
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
head = listNode1;
}
打印一个链表
public void display{
while(head.next!=null){
System.out.print(head.val+