数据结构之链表

文章目录

  • 数据结构之链表学习
  • 一、什么是链表
  • 二、创建一个链表
  • 三、 链表的构造方法
    • 遍历链表
    • 查找是否包含关键字key在链表中
    • 得到链表的长度
    • 头插法和尾插法
    • 在任意位置插入元素
    • 删除出现的第一个关键字key的节点
    • 删除所有关键字为key的节点
    • 清除所有节点
  • 总结


数据结构之链表学习

随着学习的不断深入,开始学习数据结构这一门课程,链表是数据结构中关键的学习节点之一。在本篇文章中,我们会初步介绍链表以及链表的构造方法,了解其相关的功能,并以代码和图片的方式为大家展示,不足之处望大家给予指正,共同进步。


一、什么是链表

语法说明:链表实际上是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。

语法上理解起来相对比较吃力,生活中可以举个例子来说明一下。大家可以依照火车来想象一下链表

火车都是由一节一节的车厢组成的,从而形成了一个完整的列车。链表也是如此,是由一个一个节点组成。
实际上链表的结构非常多,组合起来有8种的链表结构,在本篇我们主要介绍的是➡️单向不带头非循环链表⬅️
我们先画一个大致的图来简单介绍链表
数据结构之链表_第1张图片

数据结构之链表_第2张图片

这是一个单向不带头非循环链表,由四个节点组成,每个节点中分为2个部分,并且都是带值的,这些值代表的又是什么意思呢?
数据结构之链表_第3张图片

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;

    }

以上代码需要注意几点

  1. 我们定义了val和next之后,并没有直接给定值,是因为我们还不知道下一个节点中存储的是什么,类似于我们已经定义好了框架,具体给的值还需要重新放入。
  2. 此时的头节点已经定义,但是我们还不知道head应该指向哪一个节点。
  3. val的值需要重写构造方法,便于给成员赋值。虽然编译器会自动提供一个不带参数的构造方法给我们,但是还是需要重写一个属于我们自己的构造方法,代码需要一定的严谨性。

完成了定义之后,就需要给val赋值了,我们分别给四个节点listnode1 listnode2 listnode3 listnode4 的val赋值,12 45 23 90。如下图
数据结构之链表_第4张图片
数据结构之链表_第5张图片

这是一个不完整的链表,并没有完全串联起来。这个时候就需要用到next了,我们在文章的开头说过,next是用来存储下一个节点的地址的。

数据结构之链表_第6张图片
每一个listNode都有属于自己的地址,我们通过赋值的方式从第二个节点开始,将自己的地址赋值给前一个节点的next;最后再将listNode1赋值给head,从而我们形成了一个完整的链表。

完整的链表结构⬇️
数据结构之链表_第7张图片
数据结构之链表_第8张图片
通过调试的方法也能看到目前是已经将4个节点都串联起来了,最后一个节点的next赋值为null,也就是空的意思,我们的链表是非循环的,所以需要赋值为null。

三、 链表的构造方法

遍历链表

既然已经创建了一个链表,我们现在遍历打印出来。这里有2个很重要的条件,需要我们注意。

  1. 遍历链表的时候我们第一步肯定是先打印节点1的val,也就是head.val;遍历就需要往后走,head应该怎么往后走?
  2. 遍历肯定是需要用到循环,那我的循环条件是什么?

比方说我的头节点现在需要往后遍历了,那我现在的语法就是head=head.next,类似于++;那循环条件是什么呢?我们再看下链表的结构图
数据结构之链表_第9张图片
数据结构之链表_第10张图片
数据结构之链表_第11张图片
数据结构之链表_第12张图片
最后一张图,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+

你可能感兴趣的:(链表,数据结构)