? ? ? ? 前言:在Java編程語言中,Java集合框架提供了一組豐富的數據結構,以滿足各種應用需求。其中,LinkedList作為一種常用的數據結構,具有獨特的優勢和廣泛的應用場景。
???這里是秋刀魚不做夢的BLOG
???想要了解更多內容可以訪問我的主頁秋刀魚不做夢-CSDN博客
先讓我們看一下本文大致的講解內容:
目錄
1.LinkedList的初識
2.LinkedList的創建
3.LinkedList中的常見API
(1)添加元素
(2)刪除元素
(3)修改元素
(4)獲取元素
4.LinkedList的遍歷
(1)使用 for 循環
(2)使用增強型 for 循環
(3)使用 Iterator
(4)使用 ListIterator
(5)直接打印
5.LinkedList與ArrayList的區別
1.LinkedList的初識
? ? ? ? 在開始學習LinkedList之前,讓我們先了解一下什么是LinkedList:
????????LinkedList(雙向鏈表)是一種基于鏈表實現的線性數據結構,與ArrayList(順序表)等基于數組實現的結構不同,它通過節點的引用來管理元素的存儲和連接。
????????其中每個節點包含三個主要部分:數據部分、指向下一個節點的指針(next)和指向前一個節點的指針(prev)。
下圖很好的展示了什么是通過節點的引用來管理元素的存儲和連接以及雙向鏈表的構成:
? ? ? ?——?通過上邊的解釋,我相信讀者你已經對LinkedList(雙向鏈表)有了自己的初步認知,那么接下來我們從LinkedList在整個集合框架中與其他類與接口的關系來繼續介紹LinkedList(雙向鏈表)
LinkedList與其他類與接口的關系:
從上圖中我們可以了解到:
1.? LinkedList實現了List接口;
2.? LinkedList的底層使用了雙向鏈表;
3.? LinkedList沒有實現RandomAccess接口,因此LinkedList不支持隨機訪問;
????????通過上邊的簡單介紹,相信讀者已經大致的了解了Java中的LinkedList,那么接下來讓我們開始正式的來學習Java中的LinkedList(雙向鏈表)吧。
2.LinkedList的創建
? ? ? ? 在Java中創建LinkedList有兩種方式:
方法 | 解釋 |
---|---|
LinkedList() | 無參構造 |
public LinkedList(Collection<? extends E> c) | 使用其他集合容器中元素構造List |
(1)讓我們使用一個案例來看一下使用空參創建LinkedList的方式:
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {// 創建一個空的LinkedListLinkedList<String> linkedList = new LinkedList<>();// 添加一些元素到LinkedList中linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 輸出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}
(2)讓我們使用一個案例來看一下使用使用其他集合容器中元素構造創建LinkedList的方式:
import java.util.LinkedList;
import java.util.ArrayList;public class LinkedListFromCollection {public static void main(String[] args) {// 創建一個ArrayList并添加一些元素ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Element 1");arrayList.add("Element 2");arrayList.add("Element 3");// 使用ArrayList創建一個LinkedListLinkedList<String> linkedList = new LinkedList<>(arrayList);// 輸出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}
? ? ? ? ——這樣我們就大致的了解了如何創建LinkedList了。
3.LinkedList中的常見API
? ? ? ? 了解完如何創建一個LinkedList之后,讓我們開始學習如何去操作所創建好的LinkedList。以下我們將會從增刪查改四個方面來解釋有關LinkedList的常用API。
(1)添加元素
add(E e)
: 在鏈表末尾添加元素。
add(int index, E element)
: 在指定位置插入元素。
addFirst(E e)
: 在鏈表頭部添加元素。
addLast(E e)
: 在鏈表尾部添加元素。
接下來讓我們使用案例來幫助你進一步理解:
import java.util.LinkedList;public class LinkedListAddExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();// 在末尾添加元素linkedList.add("Element 1");linkedList.add("Element 2");// 在指定位置插入元素linkedList.add(1, "Inserted Element");// 在頭部添加元素linkedList.addFirst("First Element");// 在尾部添加元素linkedList.addLast("Last Element");//打印結果System.out.println("final: " + linkedList);}
}
(2)刪除元素
remove()
: 移除并返回鏈表的第一個元素。
remove(int index)
: 移除并返回指定位置的元素。
removeFirst()
: 移除并返回鏈表的第一個元素。
removeLast()
: 移除并返回鏈表的最后一個元素。
讓我們使用案例來幫助你進一步理解:
import java.util.LinkedList;public class LinkedListRemoveExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");System.out.println("Initial LinkedList: " + linkedList);// 移除并返回第一個元素String removedElement = linkedList.remove();System.out.println("Removed Element: " + removedElement);// 移除指定位置的元素String removedIndexElement = linkedList.remove(1);System.out.println("Removed Element at Index 1: " + removedIndexElement);// 移除第一個元素linkedList.addFirst("New First Element");String removedFirstElement = linkedList.removeFirst();System.out.println("Removed First Element: " + removedFirstElement);// 移除最后一個元素String removedLastElement = linkedList.removeLast();System.out.println("Removed Last Element: " + removedLastElement);//打印結果System.out.println("final: " + linkedList);}
}
(3)修改元素
set(int index , E element)
: 修改指定索引位置的元素。
讓我們使用案例來幫助你進一步理解:
import java.util.LinkedList;public class LinkedListSetExample {public static void main(String[] args) {// 創建一個LinkedList并添加一些元素LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");linkedList.add("Element 4");// 輸出初始的LinkedListSystem.out.println("Initial LinkedList: " + linkedList);// 使用set方法替換索引為2的元素String oldElement = linkedList.set(2, "New Element");// 輸出被替換的舊元素System.out.println("Replaced Element: " + oldElement);// 輸出修改后的LinkedListSystem.out.println("final: " + linkedList);}
}
(4)獲取元素
get(int index)
: 獲取指定位置的元素。
getFirst()
: 獲取第一個元素。
getLast()
: 獲取最后一個元素。
indexof()
: 獲取指定對象的索引(從左到右第一個)
lastindexof()
: 獲取指定對象的索引(從右到左第一個)
contains()
: 是否包含指定元素
讓我們使用案例來幫助你進一步理解:
import java.util.LinkedList;public class LinkedListGetExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 獲取指定位置的元素String elementAtIndex = linkedList.get(1);System.out.println("Element at Index 1: " + elementAtIndex);// 獲取第一個元素String firstElement = linkedList.getFirst();System.out.println("First Element: " + firstElement);// 獲取最后一個元素String lastElement = linkedList.getLast();System.out.println("Last Element: " + lastElement);// 獲取指定對象的索引(從左到右第一個)int index = linkedList.indexOf("Element 1");System.out.println(index);// 獲取指定對象的索引(從右到左第一個)int lastindex = linkedList.lastIndexOf("Element 3");System.out.println(lastindex);// 是否包含指定元素boolean contains = linkedList.contains("Element 2");System.out.println(contains);}
}
通過上邊的案例加上解釋,相信讀者已經了解了Java中LinkedList中的常用API該如何使用了。
4.LinkedList的遍歷
? ? ? ? 在Java中遍歷LinkedList的方式有五種:分別是使用 for
循環、使用增強型 for
循環、使用 Iterator、
使用 ListIterator、
以及直接打印。
????????——接下來讓我們一個一個來進行講解:
(1)使用 for
循環
import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 for 循環遍歷 LinkedListfor (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}
(2)使用增強型 for
循環
import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用增強型 for 循環遍歷 LinkedListfor (Integer element : list) {System.out.println(element);}}
}
(3)使用 Iterator
import java.util.LinkedList;
import java.util.Iterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 Iterator 遍歷 LinkedListIterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
(4)使用 ListIterator
import java.util.LinkedList;
import java.util.ListIterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 ListIterator 從前向后遍歷 LinkedListListIterator<Integer> listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}// 使用 ListIterator 從后向前遍歷 LinkedListwhile (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}}
}
(5)直接打印
import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 直接使用 System.out.println 打印 LinkedListSystem.out.println(list);}
}
——以上就是Java中遍歷LinkedList的五種方式。
5.LinkedList與ArrayList的區別
? ? ? ? 在學習完了LinkedList之后,有讀者就會發問,LinkedList和之前的ArrayList有什么區別呢?以下為LinkedList與ArrayList的區別:
不同點 | ArrayList | LinkedList |
---|---|---|
存儲空間上 | 物理上一定連續 | 邏輯上連續,但物理上不一定連續 |
隨機訪問 | 支持O(1) | 不支持:O(N) |
頭插 | 需要搬移元素,效率低O(N) | 只需修改引用的指向,時間復雜度為O(1) |
插入 | 空間不夠時需要擴容 | 沒有容量的概念 |
應用場景 | 元素高效存儲+頻繁訪問 | 任意位置插入和刪除頻繁 |
????????以上就是LinkedList和之前的ArrayList的區別,讀者要在合適的情況下選擇合適的數據結構來進行操作。
以上就是本篇文章的全部內容了~~~