Java LinkedList

Java LinkedList

Java 集合框架

連結串列(Linked list)是一種常見的基礎資料結構,是一種線性表,但是並不會按線性的順序儲存資料,而是在每一個節點裡存到下一個節點的地址。

連結串列可分為單向連結串列和雙向連結串列。

一個單向連結串列包含兩個值: 當前節點的值和一個指向下一個節點的連結。

一個雙向連結串列有三個整數值: 數值、向後的節點連結、向前的節點連結。

Java LinkedList(連結串列) 類似於 ArrayList,是一種常用的資料容器。

與 ArrayList 相比,LinkedList 的增加和刪除對操作效率更高,而查詢和修改的操作效率較低。

以下情況使用 ArrayList :

  • 頻繁訪問列表中的某一個元素。
  • 只需要在列表末尾進行新增和刪除元素操作。

以下情況使用 LinkedList :

  • 你需要通過迴圈迭代來訪問列表中的某些元素。
  • 需要頻繁的在列表開頭、中間、末尾等位置進行新增和刪除元素操作。

LinkedList 繼承了 AbstractSequentialList 類。

LinkedList 實現了 Queue 介面,可作為佇列使用。

LinkedList 實現了 List 介面,可進行列表的相關操作。

LinkedList 實現了 Deque 介面,可作為佇列使用。

LinkedList 實現了 Cloneable 介面,可實現克隆。

LinkedList 實現了 java.io.Serializable 介面,即可支援序列化,能通過序列化去傳輸。

LinkedList 類位於 java.util 包中,使用前需要引入它,語法格式如下:

// 引入 LinkedList 類
import java.util.LinkedList; 

LinkedList<E> list = new LinkedList<E>();   // 普通建立方法
或者
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合建立連結串列

建立一個簡單的連結串列例項:

// 引入 LinkedList 類

例項

import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites);
    }
}

以上例項,執行輸出結果為:

[Google, itread01, Taobao, Weibo]

更多的情況下我們使用 ArrayList 訪問列表中的隨機元素更加高效,但以下幾種情況 LinkedList 提供了更高效的方法。

在列表開頭新增元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        // 使用 addFirst() 在頭部新增元素
        sites.addFirst("Wiki");
        System.out.println(sites);
    }
}

以上例項,執行輸出結果為:

[Wiki, Google, itread01, Taobao]

在列表結尾新增元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        // 使用 addLast() 在尾部新增元素
        sites.addLast("Wiki");
        System.out.println(sites);
    }
}

以上例項,執行輸出結果為:

[Google, itread01, Taobao, Wiki]

在列表開頭移除元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 removeFirst() 移除頭部元素
        sites.removeFirst();
        System.out.println(sites);
    }
}

以上例項,執行輸出結果為:

[itread01, Taobao, Weibo]

在列表結尾移除元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 removeLast() 移除尾部元素
        sites.removeLast();
        System.out.println(sites);
    }
}

以上例項,執行輸出結果為:

[Google, itread01, Taobao]

獲取列表開頭的元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 getFirst() 獲取頭部元素
        System.out.println(sites.getFirst());
    }
}

以上例項,執行輸出結果為:

Google

獲取列表結尾的元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 getLast() 獲取尾部元素
        System.out.println(sites.getLast());
    }
}

以上例項,執行輸出結果為:

Weibo

迭代元素

我們可以使用 for 配合 size() 方法來迭代列表中的元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        sites.add("Weibo");
        for (int size = sites.size(), i = 0; i < size; i++) {
            System.out.println(sites.get(i));
        }
    }
}

size() 方法用於計算連結串列的大小。

以上例項,執行輸出結果為:

Google
itread01
Taobao
Weibo

也可以使用 for-each 來迭代元素:

例項

// 引入 LinkedList 類
import java.util.LinkedList;

public class itread01Test {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("itread01");
        sites.add("Taobao");
        sites.add("Weibo");
        for (String i : sites) {
            System.out.println(i);
        }
    }
}

以上例項,執行輸出結果為:

Google
itread01
Taobao
Weibo

常用方法

方法描述
public boolean add(E e)連結串列末尾新增元素,返回是否成功,成功為 true,失敗為 false。
public void add(int index, E element)向指定位置插入元素。
public boolean addAll(Collection c)將一個集合的所有元素新增到連結串列後面,返回是否成功,成功為 true,失敗為 false。
public boolean addAll(int index, Collection c)將一個集合的所有元素新增到連結串列的指定位置後面,返回是否成功,成功為 true,失敗為 false。
public void addFirst(E e)元素新增到頭部。
public void addLast(E e)元素新增到尾部。
public boolean offer(E e)向連結串列末尾新增元素,返回是否成功,成功為 true,失敗為 false。
public boolean offerFirst(E e)頭部插入元素,返回是否成功,成功為 true,失敗為 false。
public boolean offerLast(E e)尾部插入元素,返回是否成功,成功為 true,失敗為 false。
public void clear()清空連結串列。
public E removeFirst()刪除並返回第一個元素。
public E removeLast()刪除並返回最後一個元素。
public boolean remove(Object o)刪除某一元素,返回是否成功,成功為 true,失敗為 false。
public E remove(int index)刪除指定位置的元素。
public E poll()刪除並返回第一個元素。
public E remove()刪除並返回第一個元素。
public boolean contains(Object o)判斷是否含有某一元素。
public E get(int index)返回指定位置的元素。
public E getFirst()返回第一個元素。
public E getLast()返回最後一個元素。
public int indexOf(Object o)查詢指定元素從前往後第一次出現的索引。
public int lastIndexOf(Object o)查詢指定元素最後一次出現的索引。
public E peek()返回第一個元素。
public E element()返回第一個元素。
public E peekFirst()返回頭部元素。
public E peekLast()返回尾部元素。
public E set(int index, E element)設定指定位置的元素。
public Object clone()克隆該列表。
public Iterator descendingIterator()返回倒序迭代器。
public int size()返回連結串列元素個數。
public ListIterator listIterator(int index)返回從指定位置開始到末尾的迭代器。
public Object[] toArray()返回一個由連結串列元素組成的陣列。
public T[] toArray(T[] a)返回一個由連結串列元素轉換型別而成的陣列。

更多 API 方法可以檢視:https://www.itread01.com/manual/jdk11api/java.base/java/util/LinkedList.html

Java 集合框架