本篇内容介绍了“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怎么实现将二维数组转化为链式储存”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。