最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java語言之LinkedList和鏈表的實(shí)現(xiàn)方法

 更新時(shí)間:2023年05月17日 15:44:18   作者:tq02  
LinkedList是由傳統(tǒng)的鏈表數(shù)據(jù)結(jié)構(gòu)演變而來的,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu),它可以動(dòng)態(tài)地增加或刪除元素,下面這篇文章主要給大家介紹了關(guān)于Java語言之LinkedList和鏈表的實(shí)現(xiàn)方法,需要的朋友可以參考下

一.鏈表概念

鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的引用鏈接次序?qū)崿F(xiàn)的 。

邏輯結(jié)構(gòu):

注:1、如上圖,相當(dāng)于火車車廂,每一節(jié)都相連在一起。

       2、各個(gè)結(jié)點(diǎn)連接的方式:通過地址連接,在內(nèi)存當(dāng)中,相鄰結(jié)點(diǎn)在內(nèi)存中不一定相鄰。

       3、所有結(jié)點(diǎn)都在  堆 中申請(qǐng)出來。

       4、 每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。

二.鏈表的分類 

 1.單向、雙向鏈表

 注:無論單向還是雙向,都是一個(gè)結(jié)點(diǎn)存儲(chǔ)著下(上)一個(gè)結(jié)點(diǎn)。

2.帶頭、不帶頭結(jié)點(diǎn) 鏈表

 注:無頭和帶頭結(jié)點(diǎn)的主要區(qū)別:有一個(gè)起始結(jié)點(diǎn)。

3.循環(huán)、非循環(huán)鏈表 

循環(huán)鏈表,就是指:頭、尾結(jié)點(diǎn)有聯(lián)系。

在鏈表結(jié)構(gòu)中,這是主要的鏈表,但是這些鏈表種類還可以結(jié)合,如:帶頭雙向循環(huán)鏈表、雙向循環(huán)鏈表等等。

鏈表的種類很多,但都大同小異,我們主要學(xué)習(xí)兩種鏈表:

1、無頭單向非循環(huán)鏈表:結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來存數(shù)據(jù)。實(shí)際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多。              

2、無頭雙向鏈表:在Java的集合框架庫中LinkedList底層實(shí)現(xiàn)就是無頭雙向循環(huán)鏈表

三.無頭單向非循環(huán)鏈表的實(shí)現(xiàn)

3.1創(chuàng)建簡(jiǎn)單鏈表

重點(diǎn):每個(gè)結(jié)點(diǎn)存儲(chǔ)著下一個(gè)結(jié)點(diǎn)的地址。

創(chuàng)建鏈表代碼實(shí)現(xiàn):

public class SingleLinkedList {
      static class List{
        int item;   //	存儲(chǔ)數(shù)據(jù)
        List next;   //	指向下一個(gè)結(jié)點(diǎn)
        public List(int item) {
            this.item = item;
        }
        public List() {};
    }
//各種鏈表實(shí)現(xiàn)方法
//頭插法
public void addFirst(int data){
} 
    //尾插法
public void addLast(int data){
} 
    //任意位置插入,第一個(gè)數(shù)據(jù)節(jié)點(diǎn)為0號(hào)下標(biāo)
public void addIndex(int index,int data){
} 
    //查找是否包含關(guān)鍵字key是否在單鏈表當(dāng)中
public boolean contains(int key){
return false;
} 
    //刪除第一次出現(xiàn)關(guān)鍵字為key的節(jié)點(diǎn)
public void remove(int key){
}
    //得到單鏈表的長(zhǎng)度
public int size(){
    return -1;
}
    //鏈表的清空
public void clear() {
}
    //展示鏈表
public void display() {}

3.2 鏈表基本方法實(shí)現(xiàn)

1.遍歷鏈表元素

public void show() {
        //這里不是定義了一個(gè)節(jié)點(diǎn) 這里只是一個(gè)引用
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val+" ");
            cur = cur.next;
        }
        System.out.println();
    }

2.獲取鏈表長(zhǎng)度

 public int size(){
        int count = 0;
        ListNode cur = head;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }

 3.查詢數(shù)據(jù)

public boolean contains(int key){
        ListNode cur = head;
        while (cur != null) {
            //如果val值 是引用類型  那么這里得用equals來進(jìn)行比較!?。?
            if(cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

4.鏈表的清空

public void clear() {
        //將所有結(jié)點(diǎn)都置空,更為安全
        while (head != null) {
            ListNode headNext = head.next;
            head.next = null;
            head = headNext;
        }
    }

3.3四大基本功能      

3.3.1 、增加元素結(jié)點(diǎn)

1.頭插法:將新增結(jié)點(diǎn)放在鏈表的頭部。

public void addFirst(int data){
        ListNode node = new ListNode(data);
        node.next = head;
        head = node;
    }

2.尾插法:將新增結(jié)點(diǎn)直接連接在鏈表的尾部

 public void addLast(int data){
        ListNode node = new ListNode(data);
        if(head == null) {
            head = node;
            return;
        }
        ListNode cur = head;
        while (cur.next != null) {
            cur = cur.next;
        }
        //cur 指向的節(jié)點(diǎn)就是尾巴節(jié)點(diǎn)
        cur.next = node;
    }

3.選擇下標(biāo)值,添加結(jié)點(diǎn)

 public void addIndex(int index,int data){
        int len = size();
        //0、判斷index位置的合法性
        if(index < 0 || index > len) {
            throw new IndexOutOfBounds("任意位置插入數(shù)據(jù)的時(shí)候,index位置不合法: "+index);
        }
        if(index == 0) {
            addFirst(data);
            return;
        }
        if(index == len) {
            addLast(data);
            return;
        }
        //1、先找到index-1位置的節(jié)點(diǎn)
        ListNode cur = findIndex(index);
        //2、進(jìn)行插入
        ListNode node = new ListNode(data);
        node.next = cur.next;
        cur.next = node;
}

3.3.2.查找元素結(jié)點(diǎn)

查找一個(gè)元素,返回對(duì)應(yīng)的下標(biāo)值。

 public ListNode findIndex(int index) {
        ListNode cur = head;
        while (index - 1 != 0) {
            cur = cur.next;
            index--;
        }
        return cur;//index-1位置的節(jié)點(diǎn)
    }

3.3.3.刪除元素結(jié)點(diǎn)

先找到對(duì)應(yīng)的下標(biāo)值,然后進(jìn)行刪除。刪除方法,前一個(gè)結(jié)點(diǎn)連接到刪除結(jié)點(diǎn)的后一個(gè)結(jié)點(diǎn)。

 如圖,先斷開d2與d3的連接,然后d2直接連接d4

代碼實(shí)現(xiàn):

//刪除第一次出現(xiàn)關(guān)鍵字為key的節(jié)點(diǎn)
    public void remove(int key){
        if(head == null) {
            return;
        }
        //當(dāng)刪除結(jié)點(diǎn)為頭結(jié)點(diǎn)
        if(head.val == key) {
            head = head.next;
            return;
        }
        ListNode prev = searchPrev(key); //返回待刪除結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)
        if(prev == null) {
            System.out.println("沒有這個(gè)數(shù)據(jù)!");
            return;
        }
        ListNode del = prev.next;
        prev.next = del.next;
    }
    private ListNode searchPrev(int key) {
        ListNode prev = head;
        while (prev.next != null) {
            if(prev.next.val == key) {
                return prev;
            }else {
                prev = prev.next;
            }
        }
        return null;
    }

3.3.4.結(jié)點(diǎn)信息修改

修改指定下標(biāo)值的結(jié)點(diǎn)元素

public void searchPrev(int num,int date) {
        ListNode prev = head;
       for(int i=0;i<num-1;i++) {
                prev = prev.next;  
        }
        prev.val=date;
    }

四.LinkedList是什么?

LinkedList的底層是雙向鏈表結(jié)構(gòu),由于鏈表沒有將元素存儲(chǔ)在連續(xù)的空間中,元素存儲(chǔ)在單獨(dú)的節(jié)點(diǎn)中,然后通過引用將節(jié)點(diǎn)連接起來了,因此在在任意位置插入或者刪除元素時(shí),不需要搬移元素,效率比較高。

 如圖所示:1. LinkedList實(shí)現(xiàn)了List接口

                   2. LinkedList的底層使用了雙向鏈表

                   3. LinkedList沒有實(shí)現(xiàn)RandomAccess接口,因此LinkedList不支持隨機(jī)訪問。

                  4. LinkedList的任意位置插入和刪除元素時(shí)效率比較高,時(shí)間復(fù)雜度為O(1)

                   5. LinkedList比較適合任意位置插入的場(chǎng)景

五.LinkedList使用方法

方法解釋
   構(gòu)造方法LinkedList()   無參構(gòu)造
public LinkedList(Collection<? extends E> c)使用其他集合容器中元素構(gòu)造List
常用方法boolean add(E e)尾插e(cuò)
void add(int index,E element)將e插入到index位置
boolean addAII(Collection<? extends E> c)尾插c中的元素
E remove(int index)刪除index位置元素
boolean remove(Object o)刪除遇到的第一個(gè)o
E get( int index)獲取下標(biāo)index位置元素
void clear()清空

總結(jié)

到此這篇關(guān)于Java語言之LinkedList和鏈表的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java LinkedList和鏈表實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)

    IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)

    這篇文章主要介紹了IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文了,本文通過截圖的形式給大家展示,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • FreeMarker配置(Configuration)

    FreeMarker配置(Configuration)

    所有與該configuration 對(duì)象關(guān)聯(lián)的模版實(shí)例都就可以通過獲得to_upper 轉(zhuǎn)換器,company 來獲得字符串,因此你不需要再一次次的往root 中添加這些變量了。如果你往root 添加同名的變量,那么你新添加的變量將會(huì)覆蓋之前的共享變量。
    2016-04-04
  • 一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問題及解決方法

    一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問題及解決方法

    這篇文章主要介紹了一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問題及解決方法,需要的朋友可以參考下
    2018-11-11
  • Java編程中避免equals方法的隱藏陷阱介紹

    Java編程中避免equals方法的隱藏陷阱介紹

    這篇文章主要介紹了Java編程中避免equals方法的隱藏陷阱介紹,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot可視化接口開發(fā)工具magic-api的簡(jiǎn)單使用教程

    SpringBoot可視化接口開發(fā)工具magic-api的簡(jiǎn)單使用教程

    作為Java后端開發(fā),平時(shí)開發(fā)API接口的時(shí)候經(jīng)常需要定義Controller、Service、Dao、Mapper、XML、VO等Java對(duì)象。有沒有什么辦法可以讓我們不寫這些代碼,直接操作數(shù)據(jù)庫生成API接口呢?今天給大家推薦一款工具magic-api,來幫我們實(shí)現(xiàn)這個(gè)小目標(biāo)!
    2021-06-06
  • 解決idea啟動(dòng)報(bào)錯(cuò)javax.imageio.IIOException的問題

    解決idea啟動(dòng)報(bào)錯(cuò)javax.imageio.IIOException的問題

    這篇文章主要介紹了idea啟動(dòng)報(bào)錯(cuò)javax.imageio.IIOException,解決打不開idea問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java滾動(dòng)數(shù)組計(jì)算編輯距離操作示例

    Java滾動(dòng)數(shù)組計(jì)算編輯距離操作示例

    這篇文章主要介紹了Java滾動(dòng)數(shù)組計(jì)算編輯距離操作,涉及java字符串與數(shù)組的遍歷、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Netty進(jìn)階之ChannelPoolMap源碼解析

    Netty進(jìn)階之ChannelPoolMap源碼解析

    這篇文章主要介紹了Netty進(jìn)階之ChannelPoolMap源碼解析,ChannelPoolMap是用來存儲(chǔ)ChannelPool和指定key的一個(gè)集合Map,實(shí)際的應(yīng)用場(chǎng)景就是服務(wù)器端是一個(gè)分布式集群服務(wù),擁有多個(gè)配置地址,這樣我們就可以配置多個(gè)服務(wù)地址,減輕單臺(tái)服務(wù)器的壓力,需要的朋友可以參考下
    2023-11-11
  • Spring Boot 配置和使用多線程池的實(shí)現(xiàn)

    Spring Boot 配置和使用多線程池的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot 配置和使用多線程池的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 深入理解Java三大特性中的多態(tài)

    深入理解Java三大特性中的多態(tài)

    多態(tài)性是對(duì)象多種表現(xiàn)形式的體現(xiàn)。在面向?qū)ο笾校畛R姷亩鄳B(tài)發(fā)生在使用父類的引用來引用子類的對(duì)象。下面這篇文章主要給大家深入的介紹了Java三大特性中多態(tài)的相關(guān)資料,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01

最新評(píng)論

独山县| 微博| 邵阳市| 平顶山市| 社旗县| 寻乌县| 临武县| 衡阳市| 黄冈市| 蒲城县| 卢氏县| 凤山市| 沛县| 乌拉特后旗| 信宜市| 岳阳市| 贵溪市| 花莲市| 青阳县| 原平市| 临夏县| 来宾市| 濮阳县| 鄂伦春自治旗| 普格县| 桐乡市| 平江县| 深泽县| 广汉市| 元江| 湟中县| 莱芜市| 石家庄市| 洛阳市| 临高县| 吴桥县| 江永县| 房产| 金平| 健康| 天峨县|