【数据结构与算法】LinkedList与链表(上)

简介: 【数据结构与算法】LinkedList与链表(上)

✨hello,进来的小伙伴们,你们好耶!✨

🍊🍊系列专栏:【数据结构与算法】

🌯🌯本篇内容:初始LinkedList与链表,链表的概念,结构,基本实现,详细全面介绍!

🍼🍼作者简介:一名大三在读的科班Java编程小白,我很平凡,学会努力!

🍬🍬码云存放仓库gitee:https://gitee.com/king-zhou-of-java/java-se.git

一、ArrayList的缺陷

通过上篇博客的学习,我们可以通过ArrayList的源码了解到,ArrayList底层使用数组来存储元素。

   public class ArrayList<E> extends AbstractList<E>

       implements List<E>, RandomAccess, Cloneable, java.io.Serializable

   {

    // ...

    // 默认容量是10

     private static final int DEFAULT_CAPACITY = 10;

     //...

   

     // 数组:用来存储元素

     transient Object[] elementData; // non-private to simplify nested class access

   

     // 有效元素个数

     private int size;

     public ArrayList(int initialCapacity) {

       if (initialCapacity > 0) {

         this.elementData = new Object[initialCapacity];

      } else if (initialCapacity == 0) {

         this.elementData = EMPTY_ELEMENTDATA;

      } else {

         throw new IllegalArgumentException("Illegal Capacity: "+

                          initialCapacity);

      }

    }

因为其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低。因此:java集合中又引入了LinkedList,即链表结构。

二、链表

1、链表的概念及结构

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

即我们可以通俗的理解为比如火车的车厢,没有给这些车厢连接起来,他们只是普通的车厢,互相之间没有任何联系,通过任意一节车厢我们无法确定下一节车厢,那么给他们连接起来组成一列火车的车厢,那么就可以是看做一种链表的结构。

image.jpeg那么在实际的应用中,链表的结构也是多样的。

1.带头或者不带头。

2.单向或双向。

3.循环或非循环。

那么这些组合起来就有8种链表结构,那么我们需要重点掌握的就2种:

无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。


image.jpeg无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表 。

image.png

2、链表的实现

接下来我将模拟链表的功能实现,借助我们的idea工具来演示!

具体的实现细节都在我的代码注释中标明,大家有不懂的可以评论区或者私信我都可以的!

1.首先我们新建一个包LinkedList。

image.png

2.然后我们定义我们的实现类MySingleList,在这个类当中定义一个节点内部类ListNode,当然这个类也可以是静态的都没有什么问题,在这个类当中呢,我们定义成员变量val,和节点next。

       static class ListNode {

           public int val;

           public ListNode next;

   

           public ListNode(int val) {

               this.val = val;

   

           }

       }

3、OK那么接下来我们先创建我们的链表。

       public ListNode head;//不初始化了 默认就是null

   

       public void createList() {//最简单的方式 穷举

           ListNode listNode1 = new ListNode(12);

           ListNode listNode2 = new ListNode(23);

           ListNode listNode3 = new ListNode(34);

           ListNode listNode4 = new ListNode(45);

           ListNode listNode5 = new ListNode(56);

           listNode1.next = listNode2;//当前节点存储下一个元素的地址

           listNode2.next = listNode3;

           listNode3.next = listNode4;

           listNode4.next = listNode5;

           this.head = listNode1;

       }

看一下结果:说明我们链表创建成功了!

image.png

4.接下来我们打印这个单链表。

       public void display() {

           ListNode cur = this.head;//head不变 让我们的头结点不变 cur去变

           while (cur != null) {

               /**

                为什么是判断cur不等于空 而不是判断cur.next不为空

               我们可以打印出最后一个元素 否则提前判断 不能遍历到最后一个元素

               */

               System.out.print(cur.val+" ");

               cur = cur.next;

           }

       }

运行结果:

image.png

5.计算单链表的长度。

       public int size(){

           ListNode cur = this.head;

           int count =0;

           while(cur!=null){//可不敢写成cur.next!=null 如果链表为空的话 那么cur.next就会发生空指针异常 报错

               count++;

               cur = cur.next;

           }

           return count;

       }

运行结果:

0432aec5ab7a464681059c3ea2e3cfd6.png


相关文章
|
定位技术
百度地图拾取经纬度转为标准GEOJSON格式的函数解决方案
百度地图拾取经纬度转为标准GEOJSON格式的函数解决方案
438 0
|
算法 Java
Java项目不使用框架如何实现限流?
Java项目不使用框架如何实现限流?
213 2
|
SQL 分布式计算 Java
E-MapReduce Serverless Spark体验评测
从了解到部署实践,全方位带你体验大数据平台EMR Serverless Spark的魅力。
645 7
E-MapReduce Serverless Spark体验评测
|
人工智能 自然语言处理 机器人
用Python构建你的第一个聊天机器人
【10月更文挑战第7天】在这篇文章中,我们将一起探索如何利用Python编程语言和AI技术,一步步打造一个基础的聊天机器人。无论你是编程新手还是有一定经验的开发者,都能通过这个指南获得启发,并实现一个简单的对话系统。文章将引导你理解聊天机器人的工作原理,教你如何收集和处理用户输入,以及如何设计机器人的响应逻辑。通过动手实践,你不仅能够学习到编程技能,还能深入理解人工智能在语言处理方面的应用。
639 0
|
Kubernetes API 容器
在K8S中,deployment的yaml文件如何编写呢?
在K8S中,deployment的yaml文件如何编写呢?
|
安全 网络安全 数据安全/隐私保护
网络安全漏洞、加密技术与安全意识:保护你的数字身份
在数字化时代,网络安全和信息安全变得至关重要。本文将探讨网络安全漏洞、加密技术和安全意识的重要性,并提供一些实用的建议和技巧,帮助你保护自己的数字身份。无论你是个人用户还是企业,了解这些概念并采取适当的措施都是至关重要的。
|
JSON 数据处理 数据格式
Python中JSON结构数据的高效增删改操作
Python中JSON结构数据的高效增删改操作
225 0
|
存储 Windows
GitHub+PicGo+Typora搭建个人免费图床并实现md粘贴即上传
本文介绍基于Github平台与PicGo工具,构建免费、稳定的图床,并实现在Typora内撰写Markdown文档时,粘贴图片就可以将这一图片自动上传到搭建好的图床中的方法~
1353 3
GitHub+PicGo+Typora搭建个人免费图床并实现md粘贴即上传
|
数据采集 搜索推荐 安全
谷歌新网站多久能有排名?
答案是:谷歌新网站最快7天就能有排名。 新网站的“沙盒”现象 谷歌在对新网站进行排名时,通常会存在一个所谓的“沙盒”阶段,这是一段时间内,新网站似乎在搜索结果中被“固定”或“受限”。 沙盒现象的定义 “沙盒”现象是指新网站在初次发布后的一段时间内,尽管进行了有效的Google优化,但在搜索结果中的排名仍然不如预期。
484 0
谷歌新网站多久能有排名?
|
前端开发 Java 应用服务中间件
javaWeb 常见面试题 20道,建议收藏
javaWeb 常见面试题 20道,建议收藏
403 0