课时138:根据索引取得数据

简介: 课时138介绍了根据索引获取链表数据的方法。主要内容包括:1. 索引访问的需求与方法;2. 在ILink接口中添加get(int index)方法;3. 在Node类中实现getNode(int index)方法;4. 在LinkImpl子类中实现get(int index)方法;5. 测试代码及结果。通过这些步骤,实现了类似数组的索引访问功能,但需注意链表的时间复杂度为O(n),而数组为O(1)。

课时138:根据索引取得数据

摘要:

1. 索引访问的需求

2. 索引访问的方法

 

01. 索引访问

 

链表也可以像数组一样进行索引数据的获取。在这种情况下,我们可以继续使用递归的形式来完成。


注:数据都有索引,索引(Index)是用于标识数据位置的整数值。在链表中,索引从 0 开始,依次递增。例如,第一个数据的索引为 0,第二个数据的索引为 1,以此类推。通过索引,我们可以快速定位并获取特定位置的数据。为了根据索引获取数据,我们需要遍历链表,逐个判断当前节点的索引是否与目标索引匹配。


如果匹配,则返回该节点的数据;如果不匹配,则继续遍历下一个节点,直到找到目标索引或遍历结束。用 Foot 获取索引值,实现针对索引的控制。索引值不可超过数据量。


注:通过索引访问链表中的数据,可以方便地获取指定位置的数据项,类似于数组的访问方式。

 

image.png

 

02. 索引访问的方法

 

1.在 ILink 接口中添加 get(int index) 方法

interface ILink<E> {//设置范型避免安全隐患
    public  void  add(E e);//增加数据的个数
    public int size();//获取数据的个数
    public Object [] toArray();
     public boolean isEmpty(); 
     public  E get(int index); // 根据索引获取数据
}

 

2.在 Node 类中添加 getNode(int index) 方法

 

public E getNode(int index) {
        if (LinkImpl.this.foot ++== index) {//索引相同
            return this.data; //返回当前数据 
        } else {
            return  this.next.getNode(index);
            }
        }

 

3.在 LinkImpl 子类中实现 get(int index) 方法

public E get(int index) {
    if (index >= this.count) {// 索引应该在指定的范围内
        return null;
    }//索引数据的获取应该由 node 位完成
    this.foot = 0;//重制索引的下标
return this.root.getNode(index);
}

 

4.进行测试

public class LinkDemo {
    public static void main(String[] args) {
        ILink<String> all = new LinkImpl<String>();
        System.out.println("【增加之前】数据个数:" + all.size()+"、是否为空集合:"+all.isEmpty());
        all.add("Hello");
        all.add("World");
        all.add("MLDN");
        System.out.println("【增加之后】数据个数:" +  all.size()+"、是否为空集合:"+all.isEmpty());
        System.out.println("------数据获取的分割线-------");
        System.out.println(all.get(0));
        System.out.println(all.get(1));
        System.out.println(all.get(4)); // 索引超出范围
    }
}

执行后结果为:

image.png

通过以上步骤,我们实现了通过索引访问链表数据的能力。 这种方法与数组的访问方式类似,但需要注意的是,数组获取数据的时间复杂度为 O(1),而链表获取数据的时间复杂度为 O(n),其中 n 是链表的长度。


这是因为链表需要从头开始遍历,直到找到目标索引对应的数据。 因此,在需要频繁进行索引访问的场景下,数组可能更适合。

相关文章
|
JSON 数据格式
Redisson官方文档 - 4. 数据序列化
Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储。Redisson提供了多种的对象编码供大家选择。
10880 0
|
8月前
|
安全 前端开发
WordPress图片本地化插件
这是一款强大的图片本地化工具,可将第三方网站图片下载到本地服务器,支持手动或自动操作。它无视图片防盗链,适用于大多数可见图片。主要功能包括:按文章类型或状态设置图片本地化、自定义图片格式与匹配规则、设置请求Cookie和超时时间、白名单管理、失败处理策略等。更新后新增多项设置,如文章类型、状态筛选,以及图片保存至媒体库等功能,确保内容安全稳定展示。
165 1
|
关系型数据库 MySQL 数据库
SiteGround主机站点工具SITE TOOLS设置教程
当你使用SiteGround搭建WordPress或WooCommerce网站后,你会经常登录到两个不同的网站后台:一个是SiteGround的Site Tools后台,用于进行网站的安全、速度优化、FTP工具和网站备份等技术操作;另一个是WordPress网站后台,主要用于管理网站内容、调整前台显示样式和编辑网站功能。本文我们介绍了如何使用SiteGround SITE TOOLS主机站点工具管理网站。
453 0
SiteGround主机站点工具SITE TOOLS设置教程
|
Java 开发者 Spring
自动装配在Spring框架中的原理与实现方式
自动装配在Spring框架中的原理与实现方式
|
负载均衡 算法 Java
【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现
【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现
374 3
|
前端开发
请简述同步和异步的区别是什么
请简述同步和异步的区别是什么
633 2
|
C++
面试题:malloc和new的区别
面试题:malloc和new的区别
649 0
|
存储 安全 C++
【C++14保姆级教程】lambda 初始化捕获 new/delete 消除
【C++14保姆级教程】lambda 初始化捕获 new/delete 消除
610 0
|
Web App开发 移动开发 安全
IE浏览器,和Edge浏览器
IE浏览器,和Edge浏览器
566 0