数据结构很难?你还没有理解链表?我来帮你

链表:随机存储,顺序访问(读取)

前言

大家好,我是子浩,我是一个大三的小菜鸡,非常向往优秀,羡慕优秀的人,已拿两个暑假offer,欢迎大家找我进行交流😂😂😂
这是我的博客地址:子浩的博客https://blog.csdn.net/m0_47945515

专栏《两周干掉数据结构》

本博文的大部分插图来自于《漫画算法——小灰》,也复制了该书部分文字
我加了一些自己的总结、代码(我代码实现是参考了本书以及java自带LinkedList的源代码)
我发现本书有关链表的代码存在错误,已经向作者反馈
建议有能力的同学直接去看java自带LinkedList的源代码,写的真的好
应本书作者要求,加上本书公众号《程序员小灰》二维码
在这里插入图片描述

一、单向链表

在这里插入图片描述
链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。
链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。

什么叫随机存储呢?

如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。
上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。
在这里插入图片描述
图中的箭头代表链表节点的next指针。

链表的基本操作

1. 查找节点

在查找元素时,链表不像数组那样可以通过下标快速进行定位,只能从头节点开始向后一个一个节点逐一查找。
在这里插入图片描述

/**
     * 链表查找元素
     *
     * @param index 查找的位置
     * @return index位置的Node对象
     */
    public Node get(int index) {
   
        if (index < 0 || index > size) {
   
            throw new IndexOutOfBoundsException("超出链表的节点的范围!");
        }
        Node temp = head;
        for (int i = 0; i < index; i++) {
   
            temp = temp.next;
        }
        return temp;
    }

链表中的数据只能按顺序进行访问,最坏的时间复杂度是O(n)

2. 更新节点

在这里插入图片描述
如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。
如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)

/**
     * 更新节点 将列表中指定位置的节点的data替换为指定的data。
     *
     * @param index 需要更新的节点的位置
     * @param data  新data
     * @return 旧data
     */
    public int set(int index, int data) {
   
        Node x = get(index);
        int oldVal = x.data;
        x.data = data;
        return oldVal;
    }
3. 插入节点

只要内存空间允许,能够插入链表的元素是无穷无尽的,不需要像数组那样考虑扩容的问题。

与数组类似,链表插入节点时,同样分为3种情况。

  • 尾部插入
  • 头部插入
  • 中间插入
3.1. 尾部插入

尾部插入,是最简单的情况,把最后一个节点的next指针指向新插入的节点即可。
在这里插入图片描述

3.2. 头部插入

头部插入,可以分成两个步骤。

  1. 第1步,把新节点的next指针指向原先的头节点。
  2. 第2步,把新节点变为链表的头节点。
    在这里插入图片描述
3.3. 中间插入

中间插入,同样分为两个步骤。

  1. 第1步,新节点的next指针,指向插入位置的节点。
  2. 第2步,插入位置前置节点的next指针,指向新节点。
    在这里插入图片描述

三钟情况的代码合到一起

/**
     * 链表插入元素
     *
     * @param index 插入位置
     * @param data  插入元素 被插入的链表节点的数据
     */
    public void insert(int index, int data) {
   
        if (index < 0 || index > size
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值