1. 程式人生 > 其它 >常用資料結構:線性結構

常用資料結構:線性結構

目錄

2022最新為初學者而著!

順序表

連結串列

單鏈表:

結點的刪除:

結點的插入:

迴圈連結串列

雙鏈表

結點的刪除:

結點的插入:

佇列


2022最新為初學者而著!

Java基礎是初學者的起點,是幫助你從小白入門到精通必學基礎課程!

B站最新錄製Java300集>>> 適合準備入行開發的零基礎員學習Java,基於最新JDK13、IDEA平臺講解的,視訊中穿插多個實戰專案。每一個知識點都講解的通俗易懂,由淺入深。不僅適用於零基礎的初學者,有經驗的程式設計師也可做鞏固學習。

配套學習:​2022年Java300集最新錄製課程上線了>>>​

資料結構是計算機儲存、組織資料的方式。常見的資料結構分類方式如下圖:

常用的線性結構有:線性表,棧,佇列,迴圈佇列,陣列。線性表中包括順序表、連結串列等,其中,棧和佇列只是屬於邏輯上的概念,實際中不存在,僅僅是一種思想,一種理念;線性表則是在記憶體中資料的一種組織、儲存的方式。

順序表

順序表將元素一個接一個的存入一組連續的儲存單元中,在記憶體物理上是連續的。如下圖:

順序表儲存密度較大,節省空間;但需要事先確定容量,在時間效能方面,讀運算較快,時間複雜度為O(1);查詢運算為O(n/2),和連結串列同樣;插入運 算和刪除運算如果要操作中間一個元素,比如3,那麼就需要把3後面的元素全部進行移動,因此時間複雜度相對連結串列要大一些,插入時間複雜度最好為O(0)或 最壞為O(n);刪除時間複雜度為O([n-1]/2);

連結串列

連結串列擁有很多結點,每個結點前半部分是資料域,後半部分是指標域,指標域指標指向下一個結點;連結串列可分為單鏈表、迴圈連結串列和雙鏈表。

單鏈表:

從上圖可以看出,單鏈表的上一個結點指標指向下一個結點,最後一個結點的指標域為null。

結點的刪除:

刪除一個結點,如刪除上圖中q結點,只需將p結點中的指標域指向a3,然後將a2釋放掉(free)即可。

結點的插入:

插入一個結點,如插入上圖中s結點,首先將s的指標域指向a2(也就是把s的next賦值為p的next),然後將p結點的指標域指向x即可(p的next指向x)。

迴圈連結串列

迴圈連結串列與單鏈表唯一不同之處是,迴圈連結串列的最後一個結點指標不為空,而是指向頭結點。結點的插入和刪除和單鏈表非常相似,就不再示範了。

雙鏈表

雙鏈表擁有一前一後兩個指標域,從兩個不同的方向把連結串列連線起來,如此一來,從兩個不同的方向形成了兩條鏈,因此成為雙鏈表。因此,雙鏈表的靈活度要大於單鏈表。

結點的刪除:

雙鏈表的操作比單鏈表要稍顯複雜(按照單鏈表思路來做其實也不難),如上圖,要刪除p節點,首先需要將a1的後驅指向a3,然後將a3的前驅指向a1,最後將p節點釋放掉即可。

結點的插入:

如上圖,插入q結點,首先要按照方向,將步驟拆分,首先將q節點的前驅指向p結點後驅,緊接著將x後驅指向a2;然後按照順序完成圖中所示的3、4步即可。

從空間效能來看,連結串列的儲存密度要差一些,但在容量分配上更靈活一些。從時間效能來看,查詢運算與順序儲存相同,插入運算和刪除運算的時間複雜度為O(1),要更優於順序儲存,但讀運算則弱一些,為O([n+1]/2),最好為1,最壞為n。

上面提到棧屬於一個邏輯概念,棧的實現可以用順序也可以用鏈式。它遵循先進後出原則,如下圖:

Java中測試程式碼如下:

    package com.snail.test;  
     
    import java.util.Stack;  
     
    public class TestStack {  
     
        public static void main(String[] args) {  
              
            Stack stack = new Stack();  
            stack.push("NO1");  
            stack.push("NO2");  
            stack.push("NO3");  
              
            System.out.println("初始數量:" + stack.size());  
     
            while(!stack.isEmpty()){  
                System.out.println(stack.pop());  
            }     
              
            System.out.println("取完後的數量:" + stack.size());  
        }  
    }

佇列

佇列遵循先進先出的原則,如下圖:

Java中測試程式碼如下:

    package com.snail.test;  
     
    /**  
     *  
     * @author Zang XT  
     */ 
    import java.util.Queue;  
    import java.util.LinkedList;  
    public class TestQueue {  
        public static void main(String[] args) {  
            Queue queue = new LinkedList();  
              
            queue.offer("NO1");  
            queue.offer("NO2");  
            queue.offer("NO3");  
              
            System.out.println("初始數量" + queue.size());  
            String str;  
            while((str=queue.poll())!=null){  
                System.out.println(str);  
            }  
            System.out.println("取出後數量" + queue.size());  
        }  
    }

執行結果順序為:初始數量3,NO1,NO2,NO3,取出後數量0。

佇列還有一種形式為迴圈佇列,如下圖:

迴圈佇列有兩個指標,頭指標head和尾指標tail,尾指標一般指向的不是隊尾元素實際地址,而是指向實際地址的下一個空地址,因此,迴圈佇列一般犧牲最後一個空間,用來計算該佇列是否滿了,判斷方式是tail+1 = head,既該佇列已滿。

為了儘可能的說清楚,插了大量圖片,希望理解。以後有時間將繼續分析樹、圖等資料結構。

Java300集2022版最新教程>>>

想要Java資料或者其他語言,學習路線圖的同學,可以在評論區給我說哦~~~

關注我,帶你瞭解更多知識