1. 程式人生 > >結構與演算法(03):單向連結串列和雙向連結串列

結構與演算法(03):單向連結串列和雙向連結串列

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/model-arithmetic-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/model-arithmetic-parent) # 一、連結串列簡介 ## 1、連結串列概念 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列節點組成,節點可以在執行時動態生成,節點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 ## 2、基礎特點 **記憶體儲存** ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113251631-1687954796.png) **邏輯結構** ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113302740-2039709385.png) **特點描述** - 物理儲存上是無序且不連續的; - 連結串列是由多個節點以鏈式結構組成; - 邏輯層面上看形成一個有序的鏈路結構; 連結串列結構解決陣列儲存需要預先知道元素個數的缺陷,可以充分利用記憶體空間,實現靈活的記憶體動態管理。 # 二、單向連結串列 ## 1、基礎描述 ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113313243-151314595.png) 單向連結串列是連結串列的一種,其特點是連結串列的連結方向是單向的,連結串列的遍歷要從頭部開始順序讀取;結點構成,head指標指向第一個成為表頭結點,終止於最後一個指向NULL的指標。 ## 2、基礎操作 **新增資料** ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113322250-501455185.png) - 初始化head節點,作為連結串列的頭; - 修改當前末尾節點的next指標; - 新新增的節點房子在連結串列末尾; **刪除資料** ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113331733-2009609182.png) 遍歷找到要刪除的節點,把刪除節點前個節點的指標指向該刪除節點的下個節點; # 三、雙向連結串列 ## 1、概念描述 ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113341639-544435323.png) 雙向連結串列也叫雙鏈表,是連結串列的一種,連結串列的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅,從雙向連結串列中的任意一個結點開始,都可以很快速地訪問它的前驅結點和後繼結點,連結串列結構的使用多數都是構造雙向迴圈連結串列。 ## 2、基礎操作 **新增資料** ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113352396-1039598696.png) - 遍歷找到連結串列的最後一個節點; - 修改當前末尾節點的next指標; - 新新增的節點房子在連結串列末尾; - 新增最新尾節點的prev指標; **刪除資料** ![](https://img2020.cnblogs.com/blog/1691717/202009/1691717-20200918113401327-2003255890.png) - 雙向連結串列,基於要刪除節點操作即可; - 操作上圖中要刪除的Node2節點; - Node2.prev.next = Node2.next; - Node2.next.prev = Node2.prev; 通過上述流程的操作,就把連結串列中一個節點刪除,剩下節點再度連線成鏈式結構。 ## 3、原始碼分析 在Java的API中,LinkedList是典型的雙向連結串列結構,下面基於LinkedList原始碼看雙向連結串列的操作。 **基礎案例** ``` public class M01_Linked { public static void main(String[] args) { List