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

數據結構 - 雙向鏈表

這篇具有很好參考價值的文章主要介紹了數據結構 - 雙向鏈表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

文章目錄

目錄

文章目錄

前言

一、什么是雙向鏈表?

雙向鏈表有什么優(yōu)勢?

二、雙向鏈表的設計和實現(xiàn)

1.設計思想

尾增 : 在鏈表的末尾添加新的元素

?頭插 : 在鏈表頭部插入節(jié)點

?刪除 : 根據val的值刪除節(jié)點

?查找 : 根據索引的值查找并返回節(jié)點

總結



前言

大家好,今天給大家講解一下雙向鏈表的設計和實現(xiàn),和單向鏈表不同的是,雙向鏈表中加入了指向前一個節(jié)點的指針。


一、什么是雙向鏈表?

數據結構 - 雙向鏈表,數據結構與算法,數據結構,鏈表

如上圖所示,雙向鏈表中包含了兩個指針,一個指向前驅結點,一個指向后繼節(jié)點,其中頭結點沒有前驅節(jié)點,尾結點沒有后繼節(jié)點

前驅?: 前驅指的是當前節(jié)點的前一個節(jié)點,即在鏈表中位于當前節(jié)點之前的節(jié)點。它可以通過前向指針(previous pointer)來訪問。

后繼?:?后繼指的是當前節(jié)點的后一個節(jié)點,即在鏈表中位于當前節(jié)點之后的節(jié)點。它可以通過后向指針(next pointer)來訪問。

雙向鏈表有什么優(yōu)勢?

相對于單鏈表,雙向鏈表具有以下優(yōu)勢:

  1. 可以從任意一個節(jié)點開始進行正向或反向遍歷。由于每個節(jié)點都有指向前一個節(jié)點和后一個節(jié)點的指針,因此可以方便地在鏈表中進行前向和后向的遍歷操作。

  2. 在插入和刪除節(jié)點時,不需要遍歷整個鏈表來找到前一個節(jié)點。在單鏈表中,如果要在某個節(jié)點之后插入或刪除節(jié)點,需要先找到該節(jié)點的前一個節(jié)點,而雙向鏈表可以直接通過指針找到前一個節(jié)點,從而提高了插入和刪除操作的效率。

  3. 雙向鏈表可以更方便地實現(xiàn)反向查找。在單鏈表中,如果要查找某個節(jié)點的前一個節(jié)點,需要從頭節(jié)點開始遍歷整個鏈表,而雙向鏈表可以通過后向指針直接找到前一個節(jié)點,從而實現(xiàn)了反向查找。

總之,雙向鏈表相對于單鏈表在遍歷、插入和刪除操作上具有更高的效率和靈活性。然而,雙向鏈表的缺點是需要更多的內存空間來存儲額外的指針。

二、雙向鏈表的設計和實現(xiàn)

1.設計思想

前言 : 為了簡單起見,我們在類中只定義最基本的屬性

節(jié)點類: 不管是雙向鏈表還是單向鏈表,都是有節(jié)點所構成,所以說節(jié)點類是必不可少的(值得一提的是,節(jié)點類不一定要定義成外部類,這么一想,好像定義成內部類更加合適,畢竟節(jié)點是鏈表的一部分,大家如果自己實現(xiàn)的話可以使用內部類的方式,由于我寫博客準備的就是外部類的方式,在此就不做修改)

鏈表類: 類中應該需要包含什么信息? 聰明的讀者肯定已經想到了吧,節(jié)點啊! 你們都是聰明人啊,除了節(jié)點之外我們還需要包含一個成員變量Head(鏈表的頭結點),一個構造方法(鏈表寫出來是給別人用的),還有其他的成員方法(自己設計)。

下面給出框架代碼

public class List {
    private Node head;// 頭結點

    public List() {

    }

// 節(jié)點類
class Node {
    int val;
    Node prev;
    Node next;

    public Node() {
    }

    public Node(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + val +
                ", prev=" + prev +
                ", next=" + next +
                '}';
    }
}

2.代碼實現(xiàn)

前言 : 為了簡單起見,我們下面只實現(xiàn)基本方法并且只重點針對性的解析我認為對初學者有難度的代碼部分

和前面的部分代碼相同,有些很簡單的方法直接給出

/*
* 鏈表中元素的個數
* */
public int getSize(){
    Node cur = head;
    
    int count = 0;
    
    while(cur != null){
        cur = cur.next;
        count++;
    }
    return count;
}

/*
* 判斷鏈表是否為空
* */
public Boolean IsEmpty() {
    return head == null;
}

尾增 : 在鏈表的末尾添加新的元素

public void addNode(int val) {
    Node node = new Node(val);
    if (IsEmpty()) {
        // 鏈表為空,該節(jié)點為新頭
        head = node;
    }

    Node cur = head;

    while (cur.next != null) {
        cur = cur.next;
    }

    // 此時的cur就表示最后一個節(jié)點
    cur.next = node;
    node.prev = cur;
}

數據結構 - 雙向鏈表,數據結構與算法,數據結構,鏈表

?頭插 : 在鏈表頭部插入節(jié)點

不知道初學者有沒有感覺到什么難度,個人感覺這些代碼都是很基礎的,所以沒有進行解析

如果有問題的可以在評論區(qū)提出,我再進行修改數據結構 - 雙向鏈表,數據結構與算法,數據結構,鏈表

public void addFirst(int val){
    Node newNode = new Node(val);
    if(IsEmpty()){
        head = newNode;
    }
    newNode.next = head;
    head.prev = newNode;
    head = newNode;
}

?刪除 : 根據val的值刪除節(jié)點

這個和單鏈表比起來就簡單多了,在單鏈表中需要找到值為val的前一個節(jié)點,還需要判斷頭結點為val的情況,大家搞清楚單鏈表中的方法,雙向鏈表中的這個就是弟弟!

// 根據節(jié)點的no值刪除節(jié)點
public void DeleteNode(int no) {
    int count = 0;// 記錄被刪除節(jié)點的個數
    
    if(IsEmpty()){
        System.out.println("鏈表為空");
        return;
    }
    Node cur = head;// 將head的值賦給變量cur,使其代替head進行循環(huán)遍歷
    while(true){
        if(cur == null){
            System.out.println("共刪除了"+count+"個節(jié)點");
            // 鏈表中已經沒有值為no的節(jié)點,跳出循環(huán)
            break;
        }

        if(cur.val == no){
            Node prev = cur.prev;// 記錄將要被刪除的節(jié)點的上一個節(jié)點
            cur = cur.next;// 用下一個節(jié)點覆蓋當前節(jié)點
            cur.prev = prev;
            count++;
            continue;
        }
        cur = cur.next;
    }

?查找 : 根據索引的值查找并返回節(jié)點

// 根據索引查找節(jié)點
public Node findNode(int index) throws IndexException {
    // 索引是否合法,一看到和索引相關的問題就應該要想一下是否需要判斷索引的合法性,此處需要判斷
    if(index < 0 || index >= getSize()){
        // 自定義異常來表示索引越界這種不合法的行為
        throw new IndexException("索引越界");
    }
    
    Node cur = head;
    while(index > 0){
        index--;
        cur = cur.next;
    }
    
    return cur;
}

?寫到這里不得不感慨一下JAVA中的深情哥-Exception(異常)-上_喜歡吃animal milk的博客-CSDN博客的下篇到現(xiàn)在還沒寫

數據結構 - 雙向鏈表,數據結構與算法,數據結構,鏈表

到這里就結束了,方法在精不在多,自行領悟吧!


總結

這篇博客大家應重點關注鏈表的設計,代碼這個東西面試考的更多的是單鏈表,大家刷題更多的也是單鏈表,雙向鏈表相對于就沒有那么重要了。文章來源地址http://www.zghlxwxcb.cn/news/detail-699707.html

到了這里,關于數據結構 - 雙向鏈表的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • 【數據結構與算法】 - 雙向鏈表 - 詳細實現(xiàn)思路及代碼

    【數據結構與算法】 - 雙向鏈表 - 詳細實現(xiàn)思路及代碼

    前幾篇文章介紹了怎樣去實現(xiàn)單鏈表、單循環(huán)鏈表, 這篇文章主要介紹 雙向鏈表 以及實現(xiàn)雙向鏈表的步驟,最后提供我自己根據理解實現(xiàn)雙向鏈表的C語言代碼 。跟著后面實現(xiàn)思路看下去,應該可以看懂代碼,看懂代碼后,就對雙向鏈表有了比較抽象的理解了,最后自己再

    2024年02月01日
    瀏覽(28)
  • 【數據結構和算法】實現(xiàn)帶頭雙向循環(huán)鏈表(最復雜的鏈表)

    【數據結構和算法】實現(xiàn)帶頭雙向循環(huán)鏈表(最復雜的鏈表)

    前文,我們實現(xiàn)了認識了鏈表這一結構,并實現(xiàn)了無頭單向非循環(huán)鏈表,接下來我們實現(xiàn)另一種常用的鏈表結構,帶頭雙向循環(huán)鏈表。如有仍不了解單向鏈表的,請看這一篇文章(7條消息) 【數據結構和算法】認識線性表中的鏈表,并實現(xiàn)單向鏈表_小王學代碼的博客-CSDN博客

    2024年01月17日
    瀏覽(28)
  • 【數據結構與算法】4、雙向鏈表(學習 jdk 的 LinkedList 部分源碼)

    【數據結構與算法】4、雙向鏈表(學習 jdk 的 LinkedList 部分源碼)

    ?? 單鏈表的節(jié)點中只有一個 next 指針引用著下一個節(jié)點的地址 ?? 當要獲取單鏈表中的最后一個元素的時候,需要從頭節(jié)點開始遍歷到最后 ?? 單鏈表一開始的時候有 first 頭指針引用著頭節(jié)點的地址 ?? 雙向鏈表可以提升鏈表的綜合性能 ?? 雙向鏈表的節(jié)點中有 prev 指針引

    2024年02月12日
    瀏覽(22)
  • 數據結構課程設計題目——鏈表綜合算法設計、帶頭雙向循環(huán)鏈表、插入、顯示、刪除、修改、排序

    數據結構課程設計題目——鏈表綜合算法設計、帶頭雙向循環(huán)鏈表、插入、顯示、刪除、修改、排序

    ??課程設計題目1–鏈表綜合算法設計 ??一、設計內容 ??已知簡單的人事信息系統(tǒng)中職工記錄包含職工編號(no)、職工姓名(name)、部門名稱(depname)、職稱(title)和工資數(salary)等信息(可以增加其他信息),設計并完成一個簡單的人事信息管理系統(tǒng),要求完成但不

    2024年02月08日
    瀏覽(26)
  • 青島大學_王卓老師【數據結構與算法】Week04_04_雙向鏈表的插入_學習筆記

    青島大學_王卓老師【數據結構與算法】Week04_04_雙向鏈表的插入_學習筆記

    本文是個人學習筆記,素材來自青島大學王卓老師的教學視頻。 一方面用于學習記錄與分享,另一方面是想讓更多的人看到這么好的《數據結構與算法》的學習視頻。 如有侵權,請留言作刪文處理。 課程視頻鏈接: 數據結構與算法基礎–第04周04–2.5.4雙向鏈表2–雙向鏈表

    2024年02月12日
    瀏覽(22)
  • 數據結構-鏈表結構-雙向鏈表

    數據結構-鏈表結構-雙向鏈表

    雙向鏈表也叫雙鏈表,與單向鏈表不同的是,每一個節(jié)點有三個區(qū)域組成:兩個指針域,一個數據域 前一個指針域:存儲前驅節(jié)點的內存地址 后一個指針域:存儲后繼節(jié)點的內存地址 數據域:存儲節(jié)點數據 以下就是雙向鏈表的最基本單位 節(jié)點的前指針域指向前驅,后指針

    2024年02月04日
    瀏覽(31)
  • 【數據結構】雙向奔赴的愛戀 --- 雙向鏈表

    【數據結構】雙向奔赴的愛戀 --- 雙向鏈表

    關注小莊 頓頓解饞????? 引言:上回我們講解了單鏈表(單向不循環(huán)不帶頭鏈表),我們可以發(fā)現(xiàn)他是存在一定缺陷的,比如尾刪的時候需要遍歷一遍鏈表,這會大大降低我們的性能,再比如對于鏈表中的一個結點我們是無法直接訪問它的上一個結點,那有什么解決方法呢

    2024年04月08日
    瀏覽(27)
  • 數據結構—雙向鏈表

    數據結構—雙向鏈表

    目錄 1.? 鏈表的種類 2.? 最實用的兩種鏈表類型 3.? 實現(xiàn)雙向帶頭循環(huán)鏈表 ? ? ? ? ? ? ? ? ? 3.1 創(chuàng)建頭節(jié)點 ????????3.2 實現(xiàn)雙向循環(huán)功能—返回頭指針 ????????3.3? 尾插?? ????????3.4 頭插 ????????3.5 尾刪 ????????3.6 頭刪 4.? 實現(xiàn)兩個重要接口函數 ?

    2023年04月23日
    瀏覽(28)
  • 數據結構 - 雙向鏈表

    數據結構 - 雙向鏈表

    文章目錄 目錄 文章目錄 前言 一、什么是雙向鏈表? 雙向鏈表有什么優(yōu)勢? 二、雙向鏈表的設計和實現(xiàn) 1.設計思想 尾增 : 在鏈表的末尾添加新的元素 ?頭插 : 在鏈表頭部插入節(jié)點 ?刪除 : 根據val的值刪除節(jié)點 ?查找 : 根據索引的值查找并返回節(jié)點 總結 大家好,今天給大家講解

    2024年02月09日
    瀏覽(27)
  • 數據結構——雙向鏈表

    數據結構——雙向鏈表

    ??系列專欄:??數據結構 ?? ?歡迎關注:??點贊??收藏??留言 ?? 博客主頁:??_麥麥_的博客_CSDN博客-領域博主 ??如果我們都不能夠擁有黑夜,又該怎樣去仰望星空? ? 目錄 一、前言 二、正文——雙向鏈表的實現(xiàn) 2.1模塊化 2.2 數據類型與結構體定義 ?2.3鏈表的初始化

    2024年02月02日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包