您好,登錄后才能下訂單哦!
本篇內容介紹了“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。