国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?博主主頁: 33的博客?
??文章專欄分類:數(shù)據(jù)結(jié)構(gòu)??
??我的代碼倉庫: 33的代碼倉庫??
??????關(guān)注我?guī)銓W(xué)更多數(shù)據(jù)結(jié)構(gòu)知識
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java

1. 前言

在上一篇文章中,我們已經(jīng)認(rèn)識了順序表,通過源碼我們知道ArrayList底層是使用數(shù)組來存儲元素,當(dāng)在ArrayList任意位置插入或者刪除元素時,就需要將后序元素整體往前或者往后搬移,時間復(fù)雜度為O(n),效率比較低,因此ArrayList不適合做任意位置插入和刪除比較多的場景。因此:java集合中又引入了LinkedList,即鏈表結(jié)構(gòu)。

2.鏈表

鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的引用鏈接次序?qū)崿F(xiàn)的 。
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java
注意: 鏈?zhǔn)浇Y(jié)構(gòu)是在邏輯上連續(xù),但在物理上不一定連續(xù)。

實際中鏈表的結(jié)構(gòu)非常多樣,以下情況組合起來就有8種鏈表結(jié)構(gòu):
1.單向或者雙向
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java
2.帶頭或者不帶頭
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java
3.循環(huán)或者非循環(huán)
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java
雖然有這么多的鏈表的結(jié)構(gòu),但是我們重點掌握兩種:
無頭單向非循環(huán)鏈表:結(jié)構(gòu)簡單,一般不會單獨用來存數(shù)據(jù)。實際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多。

3.鏈表的實現(xiàn)

3.1 IList接口

public interface IList {
    //頭插法
    void addFirst(int data);
    //尾插法
    void addLast(int data);
    //任意位置插入,第一個數(shù)據(jù)節(jié)點為0號下標(biāo)
    void addIndex(int index,int data);
    //查找是否包含關(guān)鍵字key是否在單鏈表當(dāng)中
    boolean contains(int key);
    //刪除第一次出現(xiàn)關(guān)鍵字為key的節(jié)點
    void remove(int key);
    //刪除所有值為key的節(jié)點
    void removeAllKey(int key);
    //得到單鏈表的長度
    int size();
    void clear();
    void display();
}

3.2MyLinkList實現(xiàn)


public class MyLinkList implements IList{
    //內(nèi)部類
    class Node{
        public int val;
        public Node next;//下一個結(jié)點
        public Node head;//頭結(jié)點
        public Node(int val){
            this.val=val;
        }
    }  
    //自己創(chuàng)造的一個鏈表
    public void create(){
        Node node1=new Node(1);
        Node node2=new Node(2);
        Node node3=new Node(3);
        node1.next=node2;
        node2.next=node3;
       head= node1;
    }
    //頭插法
    @Override
    public void addFirst(int data) {
        Node node=new Node(data);
        node.next=head;
        head=node;
    }
    //尾插法
    @Override
    public void addLast(int data) {
    Node node=new Node(data);
    Node end=head;
    while (end.next!=null){
        end=end.next;
    }
    end.next=node;
    }
    //在某一個位置插入一個元素
    @Override
    public void addIndex(int index, int data) {
    if(index<0||index>size()){
        System.out.println("位置不合法");
        return;
    }
    if(index==0){
        addFirst(data);
        return;
    }
    if(index==size()){
        addLast(data);
        return;
    }
    Node node=new Node(data);
    Node pre=getNode(index);
    node.next=pre.next;
    pre.next=node;
    }
    public Node getNode(int index){
        Node node=head;
        while (index-1!=0){
            node=node.next;
            index--;
        }
        return node;
    }
	//是否包含某一個元素
    @Override
    public boolean contains(int key) {
        Node node=head;
        while (node!=null){
            if(node.val==key){
                return true;
            }
            node=node.next;
        }
        return false;
    }
	//刪除第一個為key的元素
    @Override
    public void remove(int key) {
    if(head.val==key){
        head=head.next;
        return;
    }
    int index=getindex(key);
    Node node=head;

    while (index-1!=0){
        node=node.next;
        index--;
    }
    node.next=node.next.next;
    }
    //根據(jù)key返回它的前一個坐標(biāo)
    public int getindex(int key){
        int count=0;
        Node node=head;
        while (node!=null){
            if(node.val==key){
                return count;
            }
            node=node.next;
            count++;
        }
        return -1;
    }
	//刪除所有為key的元素
    @Override
    public void removeAllKey(int key) {
    if (head==null){
        return;
    }
    Node node=head;
    Node cur=head.next;
    while (cur!=null){
        if(cur.val==key){
            node.next=cur.next;
            cur=cur.next;
        }else {
            node=node.next;
            cur=cur.next;
        }
    }
    if(head.val==key){
        head=head.next;
    }
    }
	//求鏈表大小
    @Override
    public int size() {
        Node node=head;
        int count=0;
        while (node!=null){
           count++;
            node=node.next;
        }
        return count;
    }
	//清空鏈表
    @Override
    public void clear() {
    Node node=head;
    while (node!=null){
        Node next=node.next;
        node.next=null;
        node=next;
    }
    head=null;
    }
	//打印鏈表
    @Override
    public void display() {
        Node node=head;
        while (node!=null){
            System.out.print(node.val+" ");
            node=node.next;
        }

    }
}

3.3 Test

public class Test {
    public static void main(String[] args) {
        MyLinkList myLinkList=new MyLinkList();
        myLinkList.create();
        myLinkList.display();
        System.out.println();
        //頭插法
        System.out.println("頭插法");
        myLinkList.addFirst(12);
        myLinkList.addFirst(13);
        myLinkList.addFirst(14);
        myLinkList.display();
        System.out.println();
        //尾插法
        System.out.println("尾插法");
        myLinkList.addLast(21);
        myLinkList.addLast(22);
        myLinkList.addLast(23);
        myLinkList.display();
        System.out.println();
        //中間位置插入
        System.out.println("在1位置插入100");
        myLinkList.addIndex(1,100);
        myLinkList.addIndex(1,100);
        myLinkList.addIndex(1,100);
        myLinkList.display();
        System.out.println();
        //查找元素
        Boolean a=myLinkList.contains(100);
        System.out.println(a);
        //刪除第一個100元素
        myLinkList.remove(100);
        myLinkList.display();
        System.out.println();
        //刪除所有100的元素
        myLinkList.removeAllKey(100);
        myLinkList.display();
        System.out.println();
        //求size
        int Size=myLinkList.size();
        System.out.println(Size);
        //清空鏈表
        myLinkList.clear();
        myLinkList.display();
    }
}

輸出結(jié)果如下:
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java

4.LinkedList

LinkedList的底層是雙向鏈表結(jié)構(gòu),由于鏈表沒有將元素存儲在連續(xù)的空間中,元素存儲在單獨的節(jié)點中,然后通過引用將節(jié)點連接起來了,因此在在任意位置插入或者刪除元素時,不需要搬移元素,效率比較高。
LinkedList源碼:
【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java

【說明】
通過上圖所示,我們可以知道LinkedList實現(xiàn)了List接口,LinkedList的底層使用了雙向鏈表。

4.1 LinkedList的使用

構(gòu)造:

方法 解釋
LinkedList() 無參構(gòu)造
public LinkedList(Collection<? extends E> c) 使用其他集合容器中元素構(gòu)造List
 public static void main(String[] args) {
 // 構(gòu)造一個空的LinkedList
 List<Integer> list1 = new LinkedList<>();
 List<String> list2 = new java.util.ArrayList<>();
 list2.add("JavaSE");
 list2.add("JavaWeb");
 list2.add("JavaEE");
 // 使用ArrayList構(gòu)造LinkedList
 List<String> list3 = new LinkedList<>(list2);
 }

其他常用方法:

方法 解釋
boolean add(E e) 尾插e
void add(int index, E element) 將 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) 尾插c中的元素
E remove(int index) 刪除 index 位置元素
boolean remove(Object o) 刪除遇到的第一個 o
E get(int index) 獲取下標(biāo) index 位置元素
E set(int index, E element) 將下標(biāo) index 位置元素設(shè)置為 element
void clear() 清空
boolean contains(Object o) 判斷 o 是否在線性表中
int indexOf(Object o) 返回第一個 o 所在下標(biāo)
int lastIndexOf(Object o) 返回最后一個 o 的下標(biāo)
List< E > subList(int fromIndex, int toIndex) 截取部分 list

4.2 LinkedList的遍歷

LinkedList<Integer> list = new LinkedList<>();
    list.add(1);   // add(elem): 表示尾插
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    System.out.println(list.size());
    // foreach遍歷
    for (int e:list) {
        System.out.print(e + " ");
    }
    System.out.println();
    // 使用迭代器遍歷---正向遍歷
    ListIterator<Integer> it = list.listIterator();
    while(it.hasNext()){
        System.out.print(it.next()+ " ");
    }
    System.out.println();

4.3ArrayList和LinkedList的區(qū)別

【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,LinkedList,java

本篇文章主要介紹了鏈表的基礎(chǔ)知識,簡單介紹了什么是鏈表以及如何實現(xiàn)一個鏈表,以及LinkedList的操作方法,在下一篇文章中博主將帶領(lǐng)同學(xué)們一起學(xué)習(xí)鏈表的相關(guān)習(xí)題。

下期預(yù)告:鏈表經(jīng)典練習(xí)題文章來源地址http://www.zghlxwxcb.cn/news/detail-849465.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)(三)】鏈表與LinkedList的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】LinkedList與鏈表

    【數(shù)據(jù)結(jié)構(gòu)】LinkedList與鏈表

    上節(jié)課已經(jīng)熟悉了ArrayList的使用,并且進(jìn)行了簡單模擬實現(xiàn)。通過源碼知道,ArrayList底層使用數(shù)組來存儲元素: 由于其底層是一段連續(xù)空間,當(dāng) 在ArrayList任意位置插入或者刪除元素時,就需要將后序元素整體往前或者往后搬移,時間復(fù)雜度為O(n),效率比較低 ,因此A rrayLi

    2024年02月07日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)—LinkedList與鏈表

    數(shù)據(jù)結(jié)構(gòu)—LinkedList與鏈表

    目錄 一、鏈表 1.?鏈表的概念及結(jié)構(gòu) 1. 單向或者雙向 2. 帶頭或者不帶頭 3. 循環(huán)或者非循環(huán) 二.LinkedList的使用 ?1.LinkedList概念及結(jié)構(gòu) 2. LinkedList的構(gòu)造 3.?LinkedList的方法 三. ArrayList和LinkedList的區(qū)別 ? ????????鏈表是一種 物理存儲結(jié)構(gòu)上非連續(xù) 存儲結(jié)構(gòu),數(shù)據(jù)元素的 邏輯

    2024年02月04日
    瀏覽(26)
  • LinkedList數(shù)據(jù)結(jié)構(gòu)鏈表

    LinkedList 在Java中是一個實現(xiàn)了 List 和 Deque 接口的雙向鏈表。它允許我們在列表的兩端添加或刪除元素,同時也支持在列表中間插入或移除元素。在分析 LinkedList 之前,需要理解鏈表這種數(shù)據(jù)結(jié)構(gòu): 鏈表 :鏈表是一種動態(tài)數(shù)據(jù)結(jié)構(gòu),由一系列節(jié)點組成,每個節(jié)點包含數(shù)據(jù)部分

    2024年02月20日
    瀏覽(19)
  • 【C/C++數(shù)據(jù)結(jié)構(gòu)】鏈表與快慢指針

    【C/C++數(shù)據(jù)結(jié)構(gòu)】鏈表與快慢指針

    目錄 一、單鏈表 二、雙向循環(huán)鏈表 三、判斷鏈表是否帶環(huán) 四、鏈表的回文結(jié)構(gòu)判斷 五、復(fù)制帶隨機指針的鏈表 優(yōu)點 :頭部增刪效率高,動態(tài)存儲無空間浪費 缺點 :尾部增刪、遍歷效率低,不支持隨機訪問節(jié)點 頭結(jié)點 :單鏈表頭結(jié)點可有可無,帶頭結(jié)點更方便進(jìn)行初始

    2024年02月16日
    瀏覽(436)
  • 【數(shù)據(jù)結(jié)構(gòu)二】鏈表和LinkedList詳解

    【數(shù)據(jù)結(jié)構(gòu)二】鏈表和LinkedList詳解

    目錄 鏈表和LinkedList ?1.鏈表的實現(xiàn) 2.LinkedList的使用 3.ArrayList和LinkedList的區(qū)別 4.鏈表OJ題訓(xùn)練 ? ? ? ? 當(dāng) 在 ArrayList 任意位置插入或者刪除元素時,就需要將后序元素整體往前或者往后 搬移,時間復(fù)雜度為 O(n) ,效率比較低,因此 ArrayList 不適合做任意位置插入和刪除比較多

    2024年01月20日
    瀏覽(41)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈表(單鏈表與雙鏈表實現(xiàn)+原理+源碼)

    【數(shù)據(jù)結(jié)構(gòu)】鏈表(單鏈表與雙鏈表實現(xiàn)+原理+源碼)

    博主介紹:?全網(wǎng)粉絲喜愛+、前后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、本質(zhì)互聯(lián)網(wǎng)精神、堅持優(yōu)質(zhì)作品共享、掘金/騰訊云/阿里云等平臺優(yōu)質(zhì)作者、擅長前后端項目開發(fā)和畢業(yè)項目實戰(zhàn)?有需要可以聯(lián)系作者我哦! ??附上相關(guān)C語言版源碼講解?? ???? 精彩專欄推薦訂閱???? 不然下次找

    2024年01月24日
    瀏覽(638)
  • 【數(shù)據(jù)結(jié)構(gòu) | 入門】線性表與鏈表 (問題引入&實現(xiàn)&算法優(yōu)化)

    【數(shù)據(jù)結(jié)構(gòu) | 入門】線性表與鏈表 (問題引入&實現(xiàn)&算法優(yōu)化)

    ???♂? 個人主頁: @計算機魔術(shù)師 ????? 作者簡介:CSDN內(nèi)容合伙人,全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者。 本文是浙大數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記專欄 這里我們引入一個問題,最常見的多項式,我們?nèi)绾问褂镁幊虒⒍囗検奖硎境鰜砟兀?我們可以使用數(shù)組來表示,但是會隨著一個問題,如下圖底

    2024年01月21日
    瀏覽(129)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法分析】反轉(zhuǎn)鏈表與順序表(內(nèi)含源碼,思路清晰)

    【數(shù)據(jù)結(jié)構(gòu)與算法分析】反轉(zhuǎn)鏈表與順序表(內(nèi)含源碼,思路清晰)

    ??順序表和鏈表都是數(shù)據(jù)結(jié)構(gòu)中常見的線性表。它們的主要區(qū)別在于 內(nèi)存管理方式不同 。 ??順序表(Array)是由一系列元素按照一定順序依次排列而成,它使用連續(xù)的內(nèi)存空間存儲數(shù)據(jù)。順序表使用一個數(shù)組來存儲數(shù)據(jù),數(shù)組中的每個元素都可以通過下標(biāo)來訪問。順序

    2024年02月07日
    瀏覽(85)
  • 【數(shù)據(jù)結(jié)構(gòu)】_4.List接口實現(xiàn)類LinkedList與鏈表

    【數(shù)據(jù)結(jié)構(gòu)】_4.List接口實現(xiàn)類LinkedList與鏈表

    目錄 1.鏈表的結(jié)構(gòu)與特點 1.1 鏈表的結(jié)構(gòu): 1.2 鏈表的特點: 2. 不帶頭單鏈表的模擬實現(xiàn) 3. 單鏈表OJ 3.1 題目1:移除鏈表元素:? 3.2 題目2:反轉(zhuǎn)一個單鏈表 3.3 題目3:返回鏈表的中間結(jié)點 3.4 題目4:鏈表的倒數(shù)第k個結(jié)點 3.5 題目5:合并兩個有序鏈表 3.6 題目6:鏈表的回文結(jié)構(gòu)

    2024年02月15日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)三叉鏈表與線索二叉樹的思路與實現(xiàn)詳解

    數(shù)據(jù)結(jié)構(gòu)三叉鏈表與線索二叉樹的思路與實現(xiàn)詳解

    ??作者主頁:微涼秋意 ?作者簡介:后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??,CSDN內(nèi)容合伙人??,阿里云專家博主?? 我們知道最常見的鏈?zhǔn)酱鎯Χ鏄涞慕Y(jié)構(gòu)體中有數(shù)據(jù)域、左孩子指針以及右孩子指針,通過遞歸來創(chuàng)建二叉樹。顯而易見的是,想找到二叉樹中任意一個結(jié)點的 前驅(qū) 或 后

    2024年02月02日
    瀏覽(99)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包