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

Java單鏈表的增刪改查與面試題詳解

 更新時(shí)間:2022年09月24日 16:12:49   作者:小黎的培培筆錄  
單鏈表是鏈表的其中一種基本結(jié)構(gòu)。一個(gè)最簡單的結(jié)點(diǎn)結(jié)構(gòu)如圖所示,它是構(gòu)成單鏈表的基本結(jié)點(diǎn)結(jié)構(gòu)。在結(jié)點(diǎn)中數(shù)據(jù)域用來存儲數(shù)據(jù)元素,指針域用于指向下一個(gè)具有相同結(jié)構(gòu)的結(jié)點(diǎn)。 因?yàn)橹挥幸粋€(gè)指針結(jié)點(diǎn),稱為單鏈表

一、單鏈表的增刪改查

1、創(chuàng)建結(jié)點(diǎn)

單鏈表是由結(jié)點(diǎn)連接而成,所以我們首先要創(chuàng)建結(jié)點(diǎn)類,用于對結(jié)點(diǎn)進(jìn)行操作。定義data屬性 表示序號,定義name屬性表示結(jié)點(diǎn)存放的數(shù)據(jù)信息,定義next屬性表示指向下一個(gè)結(jié)點(diǎn)。構(gòu)造器只需要放入data屬性和name屬性,重寫toString方法方便打印結(jié)點(diǎn)信息。

public class Node {
    public int data;
    public String name;
    public Node next;
    public Node(int data, String name){
        this.data = data;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Node{" +
                "data=" + data +
                ", name='" + name + '\'' +
                '}';
    }
}

2、單鏈表的添加操作

首先創(chuàng)建頭結(jié)點(diǎn)

此結(jié)點(diǎn)表示鏈表的頭,不存放實(shí)際數(shù)據(jù)的。

private Node head = new Node(0,"");

添加操作

將新的結(jié)點(diǎn)添加到鏈表的尾部,我們首先要遍歷鏈表,找到鏈表的尾部,然后將最后一個(gè)結(jié)點(diǎn)的next指向新的結(jié)點(diǎn),新結(jié)點(diǎn)的next指向NULL,這樣就完成了鏈表的添加操作,這種每次添加到鏈表的尾部的操作稱為尾插法。注意,當(dāng)我們遍歷鏈表時(shí),需要一個(gè)輔助結(jié)點(diǎn)temp來進(jìn)行遍歷,因?yàn)閔ead頭結(jié)點(diǎn)不能動。

public class SingleLinkedList {
    //首先創(chuàng)建頭結(jié)點(diǎn),此結(jié)點(diǎn)表示鏈表的頭,無具體數(shù)據(jù)
    private Node head = new Node(0,"");
    //添加結(jié)點(diǎn)操作
    public void addData(Node node){
        Node temp = head;
        while (true){
            if (temp.next == null){
                temp.next = node;
                node.next = null;
                break;
            }
            temp = temp.next;
        }
    }
}

3、單鏈表的刪除操作

假設(shè)我們要刪除中間這個(gè)結(jié)點(diǎn),我們只需要將這個(gè)結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)的next指向這個(gè)結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)(也就是將第一個(gè)結(jié)點(diǎn)的next指向第三個(gè)結(jié)點(diǎn))。

     public void delData(Node node){
        Node temp = head;
        while (true){
            //如果是要刪除的結(jié)點(diǎn)
            if (temp.next.data == node.data){
                temp.next = temp.next.next;
                break;
            }else if(temp.next == null){
                System.out.println("未找到結(jié)點(diǎn)!");
                break;
            }
            temp = temp.next;
        }
    }

4、單鏈表的有效結(jié)點(diǎn)的個(gè)數(shù)

我們可以定義一個(gè)計(jì)數(shù)的變量count,初始化為0,然后循環(huán)遍歷鏈表,每遍歷到一個(gè)結(jié)點(diǎn),count就加一,這樣就能求出單鏈表的有效個(gè)數(shù)。

    public int countData(){
        Node temp = head.next;
        int count = 0;
        while (true){
            if (temp == null){
                break;
            }
            count++;
            temp = temp.next;
        }
        return count;
    }

二、大廠面試題

1、新浪微博:查找單鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)

從上圖可以看出,假設(shè)要找倒數(shù)第2個(gè)結(jié)點(diǎn),我們該怎么做?不難看出,倒數(shù)第二個(gè)結(jié)點(diǎn)也是順序的第三個(gè)結(jié)點(diǎn),也就是將倒數(shù)的結(jié)點(diǎn)轉(zhuǎn)換成順序結(jié)點(diǎn),遍歷鏈表找到順序結(jié)點(diǎn)即可。因?yàn)槭怯忻鞔_表示是第幾個(gè)結(jié)點(diǎn),所以我們需要知道結(jié)點(diǎn)的有效個(gè)數(shù),前面我們介紹了有效個(gè)數(shù)的求法,直接用即可。當(dāng)我們要找倒數(shù)第k個(gè)結(jié)點(diǎn),我們可以轉(zhuǎn)換成順序的第(count - k + 1)個(gè)結(jié)點(diǎn)。比如:k = 2,count = 4, 倒數(shù)第2個(gè)結(jié)點(diǎn)也就是順序第(4 - 2 + 1 = 3)個(gè)結(jié)點(diǎn)。

    public Node referNode(int n){
        //根據(jù)前面計(jì)算有效個(gè)數(shù)的方法,求得鏈表總結(jié)點(diǎn)個(gè)數(shù)
        int max = countData();
        //計(jì)數(shù)
        int count = 1;
        //判斷指定的結(jié)點(diǎn)是否在范圍內(nèi)
        if (!(n >= 1 && n <= max)){
            throw new RuntimeException("沒有此結(jié)點(diǎn)!");
        }
        //輔助結(jié)點(diǎn)
        Node temp = head.next;
        //循環(huán)遍歷查找
        while (true){
            //滿足條件,則是我們要找的結(jié)點(diǎn)
            if (count == (max - n + 1)){
                return temp;
            }else {
                temp = temp.next;
                count++;
            }
        }
    }

2、騰訊面試題:單鏈表的反轉(zhuǎn)

首先創(chuàng)建輔助變量temp用于循環(huán)原來的鏈表,輔助變量temp1記錄temp的下一個(gè)位置,每遍歷到一個(gè)結(jié)點(diǎn)就插入到新鏈表的頭部,這種方式稱為頭插法。

public void nodeReversal(Node head){
        //如果鏈表為空或鏈表只有一個(gè)結(jié)點(diǎn),則不需要反轉(zhuǎn)
        if (head.next == null || head.next.next == null){
            return;
        }
        //輔助變量temp
        Node temp = head.next;
        //輔助變量temp1
        Node temp1 = null;
        //循環(huán)遍歷
        while (true){
            //退出循環(huán)的條件
            if (temp == null){
                break;
            }
            //首先將temp的下一個(gè)結(jié)點(diǎn)給temp1
            temp1 = temp.next;
            //然后將temp的next指向新鏈表頭headReversal的next(頭指向的下一個(gè))
            temp.next = headReversal.next;
            //再然后將新鏈表頭headReversal的next指向temp結(jié)點(diǎn)
            headReversal.next = temp;
            //最后將temp1記錄的結(jié)點(diǎn)賦值給temp
            temp = temp1;
        }
        //遍歷結(jié)束,將新的順序替換原來的順序
        head.next = headReversal.next;
        //顯示鏈表,這個(gè)方法需要自己寫
        showList(head);
}

到此這篇關(guān)于Java單鏈表的增刪改查與面試題詳解的文章就介紹到這了,更多相關(guān)Java單鏈表增刪改查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何實(shí)現(xiàn)java Iterator迭代器功能

    如何實(shí)現(xiàn)java Iterator迭代器功能

    這篇文章主要介紹了如何實(shí)現(xiàn)java Iterator迭代器功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java鏈表的天然遞歸結(jié)構(gòu)性質(zhì)圖文與實(shí)例分析

    Java鏈表的天然遞歸結(jié)構(gòu)性質(zhì)圖文與實(shí)例分析

    這篇文章主要介紹了Java鏈表的天然遞歸結(jié)構(gòu)性質(zhì),結(jié)合圖文與實(shí)例形式分析了java鏈表中遞歸操作的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • cmd中javac命令無法運(yùn)行(java指令能運(yùn)行)解決步驟

    cmd中javac命令無法運(yùn)行(java指令能運(yùn)行)解決步驟

    這篇文章主要介紹了在安裝JDK后,執(zhí)行javac命令沒有返回值的問題,可能是由于命令提示符窗口緩存問題、系統(tǒng)路徑優(yōu)先級問題、文件權(quán)限問題或命令行輸入問題,文中通過代碼將解決的步驟介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • Java實(shí)現(xiàn)圖書借閱系統(tǒng)

    Java實(shí)現(xiàn)圖書借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java基礎(chǔ)之static關(guān)鍵字的使用講解

    Java基礎(chǔ)之static關(guān)鍵字的使用講解

    這篇文章主要介紹了Java基礎(chǔ)之static關(guān)鍵字的使用講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Java動態(tài)調(diào)用類中方法代碼

    Java動態(tài)調(diào)用類中方法代碼

    這篇文章主要介紹了Java動態(tài)調(diào)用類中方法代碼,需要的朋友可以參考下
    2014-02-02
  • Springboot解決no main manifest attribute錯誤

    Springboot解決no main manifest attribute錯誤

    在開發(fā)Springboot項(xiàng)目時(shí),使用java -jar命令運(yùn)行jar包可能出現(xiàn)no main manifest attribute錯誤,本文就來介紹一下該錯誤的解決方法,感興趣的可以了解一下
    2024-09-09
  • Java實(shí)例講解動態(tài)代理

    Java實(shí)例講解動態(tài)代理

    動態(tài)代理指的是,代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對象的方法,是在程序運(yùn)行時(shí)根據(jù)需要動態(tài)的創(chuàng)建目標(biāo)類的代理對象。本文將通過案例詳細(xì)講解一下動態(tài)代理,需要的可以參考一下
    2022-06-06
  • Java項(xiàng)目開發(fā)中實(shí)現(xiàn)分頁的三種方式總結(jié)

    Java項(xiàng)目開發(fā)中實(shí)現(xiàn)分頁的三種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目開發(fā)中實(shí)現(xiàn)分頁的三種方式,通過這一篇文章可以很快的學(xué)會java分頁功能,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Spring基于注解讀取外部配置文件

    Spring基于注解讀取外部配置文件

    這篇文章主要介紹了Spring基于注解讀取外部配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評論

宝坻区| 茌平县| 鄂托克前旗| 丰都县| 胶州市| 鄂托克旗| 莱芜市| 云阳县| 桃源县| 罗田县| 太仆寺旗| 皋兰县| 资源县| 八宿县| 读书| 庄浪县| 西华县| 海宁市| 南皮县| 太白县| 浦城县| 瓦房店市| 辽源市| 平武县| 论坛| 鄯善县| 祁东县| 永登县| 临澧县| 威宁| 阳江市| 西和县| 伊宁市| 讷河市| 六盘水市| 闽侯县| 吴堡县| 庆阳市| 镇康县| 米泉市| 正宁县|