結構與演算法(03):單向連結串列和雙向連結串列
阿新 • • 發佈:2020-09-18
本文原始碼:[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