利用Java如何实现将二维数组转化为链式储存

 更新时间:2021年12月15日 09:55:43   作者:HairLossException  
链式结构不要求逻辑上相邻的节点在物理位置上也相邻,节点间的逻辑关系是由附加的指针字段表示的,通常借助于程序设计中的指针结构来实现,这篇文章主要给大家介绍了关于利用Java如何实现将二维数组转化为链式储存的相关资料,需要的朋友可以参考下

链式存储结构

链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素。由于不需要按顺序存储,链表在插入、删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢。

使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理。但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空间开销较大。

下图就是最简单最一般的单向链表:

代码思路

将二维数组压缩成链式存储大体思路与数组压缩成稀疏数组相似
这里我将链表的头节点储存二维数组的总行数、列数和有效值个
数 头结点之后的每个结点存储有效值的下标和值 转化思路如下图所示

代码实现

创建模拟结点的类 提供构造方法和toString

/**
 * 模拟结点
 */
public class SingleNode {
    /**
     * @row 行号
     * @column 列号
     * @num 值
     */
    public int row;
    public int colunm;
    public int num;
    /**
     *next域:指向下一个结点
     */
    public SingleNode next;

    public SingleNode(int row, int colunm, int num) {
        this.row = row;
        this.colunm = colunm;
        this.num = num;
    }

    @Override
    public String toString() {
        return "SingleNode{" + "row=" + row + ", colunm=" + colunm + ", num=" + num + '}';
    }
}

创建模拟链表类 提供添加结点、遍历链表和还原数组等方法

public class SingleLinkList {
    //头节点
    private SingleNode headSingleNode;
	//通过构造行数初始化头节点
    public SingleLinkList(SingleNode headSingleNode) {
        this.headSingleNode = headSingleNode;
    }

    /**
     * 添加结点(追加在链表的尾端)
     */
    public void add(SingleNode SingleNode){
        SingleNode temp = headSingleNode;
        while(true){
            if (temp.next == null) {
                //如果这个结点的next域为空就跳出while循环
                break;
            }
            //将下一个结点赋值给temp
            temp = temp.next;
        }
        temp.next= SingleNode;
    }
    /**
     * 遍历单项链表
     */
    public void show(){
        if (headSingleNode.next == null) {
            System.out.println("当前链表为空");
            return;
        }
        SingleNode temp = headSingleNode;
        while (true){
            if (temp.next == null){
                break;
            }
            temp = temp.next;
            System.out.println(temp);
        }
    }

    /**
     * 将链表还原成二维数组
     * @return array还原后的二维数组
     */
    public int[][] backToArray(){
        SingleNode temp = headSingleNode;
        //头结点中存储着原数组的行数和列数
        //通过这两个值创建二维数组
        int[][] array = new int[headSingleNode.row][headSingleNode.colunm];
        while (true){
            if (temp.next == null){
                break;
            }
            temp = temp.next;
            //每遍历一个结点就还原一个数据
            array[temp.row][temp.colunm] = temp.num;
        }
        return array;
    }
}
public class ArrayToLink {
    public static void main(String[] args) {
        int[][] array = new int[4][5];
        //初始化二维数组
        array[0][2] = 1;
        array[1][1] = 2;
        array[2][3] = 3;

        System.out.println("========普通数组========");
        //遍历二维数组
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j]!=0){
                    count++;
                }
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }

        //将数组转化成链式存储
        SingleLinkList list = new SingleLinkList(new SingleNode(array.length,array[0].length,count));
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0){
                	//当数字不为0时视为有效值就创建一个结点并添加到链表尾部
                    list.add(new SingleNode(i,j,array[i][j]));
                }
            }
        }
        System.out.println("========转化后的链表========");
        //遍历单向链表
        list.show();

        int[][] returnArray = list.backToArray();
        //遍历还原后的二维数组
        System.out.println("========还原后的数组========");
        for (int i = 0; i < returnArray.length; i++) {
            for (int j = 0; j < returnArray[i].length; j++) {
                System.out.print(returnArray[i][j] + " ");
            }
            System.out.println();
        }
    }
}

输出结果

总结

到此这篇关于利用Java如何实现将二维数组转化为链式储存的文章就介绍到这了,更多相关Java二维数组转链式储存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Graylog做日志收集实现过程

    SpringBoot整合Graylog做日志收集实现过程

    这篇文章主要为大家介绍了SpringBoot整合Graylog做日志收集实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringBoot整合RocketMQ实现消息发送和接收的详细步骤

    SpringBoot整合RocketMQ实现消息发送和接收的详细步骤

    这篇文章主要介绍了SpringBoot整合RocketMQ实现消息发送和接收功能,我们使用主流的SpringBoot框架整合RocketMQ来讲解,使用方便快捷,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • springboot 整合 clickhouse的实现示例

    springboot 整合 clickhouse的实现示例

    本文主要介绍了springboot 整合 clickhouse的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 基于Java制作一个简易的远控终端

    基于Java制作一个简易的远控终端

    这篇文章主要为大家详细介绍了如何基于Java制作一个简易的远控终端,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-04-04
  • Spring Security基于散列加密方案实现自动登录功能

    Spring Security基于散列加密方案实现自动登录功能

    为了提高项目的用户体验,我们可以在项目中添加自动登录功能,当然也要给用户提供退出登录的功能。接下来学习下Spring Security基于散列加密方案实现自动登录功能,一起看看吧
    2021-09-09
  • mybatis Invalid bound statement(not found)排坑记录

    mybatis Invalid bound statement(not foun

    这篇文章主要介绍了mybatis Invalid bound statement(not found)排坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • spring如何实现两个xml配置文件间的互调

    spring如何实现两个xml配置文件间的互调

    这篇文章主要介绍了spring如何实现两个xml配置文件间的互调,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • springBoot项目集成quartz开发定时任务案例及注意事项

    springBoot项目集成quartz开发定时任务案例及注意事项

    这篇文章主要介绍了springBoot项目集成quartz开发定时任务案例及注意事项,这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度,需要的朋友可以参考下
    2022-06-06
  • JAVA8之函数式编程Function接口用法

    JAVA8之函数式编程Function接口用法

    这篇文章主要介绍了JAVA8之函数式编程Function接口用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Springboot项目中使用redis的配置详解

    Springboot项目中使用redis的配置详解

    这篇文章主要介绍了Springboot项目中使用redis的配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论