文章目录
数据结构之链表学习
随着学习的不断深入,开始学习数据结构这一门课程,链表是数据结构中关键的学习节点之一。在本篇文章中,我们会初步介绍链表以及链表的构造方法,了解其相关的功能,并以代码和图片的方式为大家展示,不足之处望大家给予指正,共同进步。
一、什么是链表
语法说明:链表实际上是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
语法上理解起来相对比较吃力,生活中可以举个例子来说明一下。大家可以依照火车来想象一下链表🧷
火车都是由一节一节的车厢组成的,从而形成了一个完整的列车。链表也是如此,是由一个一个节点组成。
实际上链表的结构非常多,组合起来有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和next之后,并没有直接给定值,是因为我们还不知道下一个节点中存储的是什么,类似于我们已经定义好了框架,具体给的值还需要重新放入。
- 此时的头节点已经定义,但是我们还不知道head应该指向哪一个节点。
- val的值需要重写构造方法,便于给成员赋值。虽然编译器会自动提供一个不带参数的构造方法给我们,但是还是需要重写一个属于我们自己的构造方法,代码需要一定的严谨性。
完成了定义之后,就需要给val赋值了,我们分别给四个节点listnode1 listnode2 listnode3 listnode4 的val赋值,12 45 23 90。如下图
这是一个不完整的链表,并没有完全串联起来。这个时候就需要用到next了,我们在文章的开头说过,next是用来存储下一个节点的地址的。
每一个listNode都有属于自己的地址,我们通过赋值的方式从第二个节点开始,将自己的地址赋值给前一个节点的next;最后再将listNode1赋值给head,从而我们形成了一个完整的链表。
完整的链表结构⬇️
通过调试的方法也能看到目前是已经将4个节点都串联起来了,最后一个节点的next赋值为null,也就是空的意思,我们的链表是非循环的,所以需要赋值为null。
三、 链表的构造方法
遍历链表
既然已经创建了一个链表,我们现在遍历打印出来。这里有2个很重要的条件,需要我们注意。
- 遍历链表的时候我们第一步肯定是先打印节点1的val,也就是head.val;遍历就需要往后走,head应该怎么往后走?
- 遍历肯定是需要用到循环,那我的循环条件是什么?
比方说我的头节点现在需要往后遍历了,那我现在的语法就是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+" ");
}
System.out.println();
}
//测试
public static void main