JAVA数据结构与算法基础——链表(LinkedList)【云图智联】

在本节中,我们将看到一种新的数据存储结构,它可以解决上面的一些问题。这种数据存储结构就是链表链表可能是继数组之后第二种使用最广泛的通用存储结构。

    在本章中,我们将学习:

  •     单链表

  •     双端链表

  •     有序链表

  •     双向列表

  •     有迭代器的列表

   链表与数组一样,都作为数据的基本存储结构,但是在存储原理上二者是不同的。在数组中,数据是存储在一段连续的内存空间中,我们可以通过下标来访问数组中的元素;而在链表中,元素是存储在不同的内存空间中,前一个元素的位置维护了后一个元素在内存中的地址,在Java中,就是前一个元素维护了后一个元素的引用。在本教程我们,我们将链表中的每个元素称之为一个节点(Node)。对比数组, 链表的数据结构可以用下图表示

Image.png

这张图显示了一个链表的数据结构,链表中的每个Node都维护2个信息:一个是这个Node自身存储的数据Data,另一个是下一个Node的引用,图中用Next表示。对于最后一个Node,因为没有下一个元素了,所以其并没有引用其他元素,在图中用紫色框来表示。

这张图主要显示的是链表中Node的内部结构和Node之间的关系。一般情况下,我们在链表中还要维护第一个Node的引用,原因是在链表中访问数据必须通过前一个元素才能访问下一个元素,如果不知道第一个Node的话,后面的Node都不可以访问。事实上,对链表中元素的访问,都是从第一个Node中开始的,第一个Node是整个链表的入口;而在数组中,我们可以通过下标进行访问元素。

Node.Java:

  1. public class Node {
  2.     //Node中维护的数据
  3.        private Object data;
  4.        //下一个元素的引用
  5.        private Node next;
  6.     
  7.     // setters and getters
  8. }

一、单链表Java实现

本节介绍单链表的Java实现,我们用SingleLinkList来表示。

分析:

1、SingleLinkList中要维护的信息:维护第一个节点(firstNode)的引用,作为整个链表的入口;

2、插入操作分析:基于链表的特性,插入到链表的第一个位置是非常快的,因为只要改变fisrtNode的引用即可。因此对于单链表,我们会提供addFirst方法。

3、查找操作分析:从链表的fisrtNode开始进行查找,如果确定Node中维护的data就是我们要查找的数据,即返回,如果不是,根据next获取下一个节点,重复这些步骤,直到找到最后一个元素,如果最后一个都没找到,返回null。

4、删除操作分析

     首先查找到要删除的元素节点,同时将这个节点的上一个节点和下一个节点也要记录下来,只要将上一个节点的next引用直接指向下一个节点即可,这就相当于 删除了这个节点。如果要删除的是第一个节点,直接将LinkList的firstNode指向第二个节点即可。如果删除的是最后一个节点,只要将上一个节 点的next引用置为null即可。上述分析,可以删除任意节点,具有通用性但是效率较低。通常情况下,我们还会提供一个removeFirst方法,因为这个方法效率较高,同样只要改变fisrtNode的引用即可。  

此外,根据情况而定,可以选择是否要维护链表中元素的数量size,不过这不是实现一个链表必须的核心特性。

SingleLinkL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值