溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現(xiàn)將二維數(shù)組轉化為鏈式儲存

發(fā)布時間:2021-12-17 14:21:38 來源:億速云 閱讀:134 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“Java怎么實現(xiàn)將二維數(shù)組轉化為鏈式儲存”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

鏈式存儲結構

鏈式存儲結構的線性表將采用一組任意的存儲單元存放線性表中的數(shù)據(jù)元素。由于不需要按順序存儲,鏈表在插入、刪除數(shù)據(jù)元素時比順序存儲要快,但是在查找一個節(jié)點時則要比順序存儲要慢。

使用鏈式存儲可以克服順序線性表需要預先知道數(shù)據(jù)大小的缺點,鏈表結構可以充分利用內存空間,實現(xiàn)靈活的內存動態(tài)管理。但是鏈式存儲失去了數(shù)組隨機存取的特點,同時增加了節(jié)點的指針域,空間開銷較大。

下圖就是最簡單最一般的單向鏈表:

Java怎么實現(xiàn)將二維數(shù)組轉化為鏈式儲存

代碼思路

將二維數(shù)組壓縮成鏈式存儲大體思路與數(shù)組壓縮成稀疏數(shù)組相似
這里我將鏈表的頭節(jié)點儲存二維數(shù)組的總行數(shù)、列數(shù)和有效值個
數(shù) 頭結點之后的每個結點存儲有效值的下標和值 轉化思路如下圖所示

Java怎么實現(xiàn)將二維數(shù)組轉化為鏈式儲存

代碼實現(xiàn)

創(chuàng)建模擬結點的類 提供構造方法和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 + '}';
    }
}

創(chuàng)建模擬鏈表類 提供添加結點、遍歷鏈表和還原數(shù)組等方法

public class SingleLinkList {
    //頭節(jié)點
    private SingleNode headSingleNode;
	//通過構造行數(shù)初始化頭節(jié)點
    public SingleLinkList(SingleNode headSingleNode) {
        this.headSingleNode = headSingleNode;
    }

    /**
     * 添加結點(追加在鏈表的尾端)
     */
    public void add(SingleNode SingleNode){
        SingleNode temp = headSingleNode;
        while(true){
            if (temp.next == null) {
                //如果這個結點的next域為空就跳出while循環(huán)
                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);
        }
    }

    /**
     * 將鏈表還原成二維數(shù)組
     * @return array還原后的二維數(shù)組
     */
    public int[][] backToArray(){
        SingleNode temp = headSingleNode;
        //頭結點中存儲著原數(shù)組的行數(shù)和列數(shù)
        //通過這兩個值創(chuàng)建二維數(shù)組
        int[][] array = new int[headSingleNode.row][headSingleNode.colunm];
        while (true){
            if (temp.next == null){
                break;
            }
            temp = temp.next;
            //每遍歷一個結點就還原一個數(shù)據(jù)
            array[temp.row][temp.colunm] = temp.num;
        }
        return array;
    }
}
public class ArrayToLink {
    public static void main(String[] args) {
        int[][] array = new int[4][5];
        //初始化二維數(shù)組
        array[0][2] = 1;
        array[1][1] = 2;
        array[2][3] = 3;

        System.out.println("========普通數(shù)組========");
        //遍歷二維數(shù)組
        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();
        }

        //將數(shù)組轉化成鏈式存儲
        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){
                	//當數(shù)字不為0時視為有效值就創(chuàng)建一個結點并添加到鏈表尾部
                    list.add(new SingleNode(i,j,array[i][j]));
                }
            }
        }
        System.out.println("========轉化后的鏈表========");
        //遍歷單向鏈表
        list.show();

        int[][] returnArray = list.backToArray();
        //遍歷還原后的二維數(shù)組
        System.out.println("========還原后的數(shù)組========");
        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怎么實現(xiàn)將二維數(shù)組轉化為鏈式儲存

“Java怎么實現(xiàn)將二維數(shù)組轉化為鏈式儲存”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI