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

【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】

這篇具有很好參考價(jià)值的文章主要介紹了【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.雙鏈表

雙鏈表是一種數(shù)據(jù)結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)包含一個(gè)指向前一個(gè)節(jié)點(diǎn)的指針和一個(gè)指向后一個(gè)節(jié)點(diǎn)的指針。由于鏈表沒有將元素存儲(chǔ)在連續(xù)的空間中,元素存儲(chǔ)在單獨(dú)的節(jié)點(diǎn)中,然后通過引用將節(jié)點(diǎn)連接起來,因此雙鏈表可以任意且快速的插入和刪除元素。
【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】,Java數(shù)據(jù)結(jié)構(gòu),java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言

2.雙鏈表的創(chuàng)建

引用接口IList,在把IList接口里面的方法進(jìn)行重寫,實(shí)現(xiàn)雙鏈表的功能。把雙鏈表封裝成一個(gè)類,類中封裝一個(gè)節(jié)點(diǎn)類ListNode,里面的節(jié)點(diǎn)類有當(dāng)前節(jié)點(diǎn)的值val、指向前一個(gè)節(jié)點(diǎn)的ListNode prev和指向后一個(gè)節(jié)點(diǎn)的變量ListNode next。最后在外部類中定義頭節(jié)點(diǎn)、尾節(jié)點(diǎn),利用外部類的構(gòu)造器中就可以對(duì)頭尾節(jié)點(diǎn)的初始化。

public class MyLinkedList implements IList{
    static class ListNode {
        public int val;
        public ListNode next;
        public ListNode prev;

        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
    public ListNode last;
}

3.雙鏈表的頭插節(jié)點(diǎn)

頭插node節(jié)點(diǎn),如果鏈表為空,直接把插入的節(jié)點(diǎn)設(shè)為頭尾節(jié)點(diǎn),不為空把node的下一個(gè)節(jié)點(diǎn)指向head頭節(jié)點(diǎn),再把head的前節(jié)點(diǎn)指向node,最后把head指向node。
【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】,Java數(shù)據(jù)結(jié)構(gòu),java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言

    public void addFirst(int data) {
        ListNode node = new ListNode(data);

        if (head == null) {
            head = node;
            last = node;
        }else {
            node.next = head;
            head.prev = node;
            head = node;
        }
    }

4.雙鏈表尾插

尾插node節(jié)點(diǎn),如果鏈表為空,直接把插入的節(jié)點(diǎn)設(shè)為頭尾節(jié)點(diǎn),不為空把last尾節(jié)點(diǎn)的next(即后節(jié)點(diǎn))指向node,再把node的前節(jié)點(diǎn)prev指向last,最后把尾節(jié)點(diǎn)last指向node。
【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】,Java數(shù)據(jù)結(jié)構(gòu),java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言

    @Override
    public void addLast(int data) {
        ListNode node = new ListNode(data);
        if (head == null) {
            head = node;
            last = node;
        }else {
            last.next = node;
            node.prev = last;
            last = node;
        }
    }

5.雙鏈表根據(jù)索引找節(jié)點(diǎn)

定義一個(gè)count變量來計(jì)數(shù),從頭節(jié)點(diǎn)開始遍歷,當(dāng)計(jì)數(shù)值為索引值退出循環(huán),返回cur為插入節(jié)點(diǎn)的后節(jié)點(diǎn)。

    private ListNode findIndex(int index) {
        int count = 0;
        ListNode cur = head;
        while (count != index) {
            count++;
            cur = cur.next;
        }
        return cur;
    }

6.雙鏈表根據(jù)索引插入節(jié)點(diǎn)

根據(jù)索引插入可分三種情況:

  • 當(dāng)在最前面插入節(jié)點(diǎn)時(shí)為頭插法
  • 在最后一個(gè)位置插入則是尾插法
  • 中間插入時(shí)遍歷鏈表找到插入節(jié)點(diǎn)為node的下標(biāo),然后1:把node的后節(jié)點(diǎn)指向cur 即node.next = cur;2:把cur前節(jié)點(diǎn)的后節(jié)點(diǎn)指向node,即cur.prev.next = node;3:把node的前節(jié)點(diǎn)指向cur的前節(jié)點(diǎn),即node.prev = cur.prev;4:把cur的前節(jié)點(diǎn)指向node,即cur.prev = node。
    【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】,Java數(shù)據(jù)結(jié)構(gòu),java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言
    @Override
    public void addIndex(int index, int data) throws IndexException{
        if (index < 0 || index > size()) {
            throw new IndexException("雙向鏈表插入,index不合法"+index);
        }

        ListNode node = new ListNode(data);
        // 在0位置就是頭插法
        if(index == 0) {
            addFirst(data);
            return;
        }

        // 在最后一個(gè)位置插入
        if (index == size()) {
            addLast(data);
            return;
        }

        // 中間
        ListNode cur = findIndex(index);
        node.next = cur;
        cur.prev.next = node;
        node.prev = cur.prev;
        cur.prev = node;
    }
}

7.雙鏈表刪除值為key的節(jié)點(diǎn)

遍歷鏈表,若cur.val為key,刪除cur節(jié)點(diǎn)

  • 若cur為head頭節(jié)點(diǎn)時(shí),把head指向head的后節(jié)點(diǎn),當(dāng)head不為空時(shí),把head的前節(jié)點(diǎn)直接置為null,只有一個(gè)節(jié)點(diǎn)時(shí)直接把last指向null。
  • 當(dāng)cur不等于頭節(jié)點(diǎn)head時(shí),把cur前節(jié)點(diǎn)的后節(jié)點(diǎn)指向cur的后節(jié)點(diǎn),即:cur.prev.next = cur.next。若cur的后節(jié)點(diǎn)不為空即刪除中間節(jié)點(diǎn)時(shí):把cur的后節(jié)點(diǎn)的前節(jié)點(diǎn)指向cur的前節(jié)點(diǎn),即:cur.next.prev = cur.prev,若cur為尾節(jié)點(diǎn)時(shí),把last指向last的前節(jié)點(diǎn),即:last = last.prev。
  • 【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】,Java數(shù)據(jù)結(jié)構(gòu),java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言
    @Override
    public void remove(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                if (cur == head) {
                    head = head.next;
                    if (head != null) {
                        head.prev = null;
                    }else {
                        //只有一個(gè)節(jié)點(diǎn) 且是需要?jiǎng)h除的節(jié)點(diǎn)
                        last = null;
                    }
                }else {
                    cur.prev.next = cur.next;
                    //刪除中間節(jié)點(diǎn)
                    if (cur.next != null) {
                        //cur.prev.next = cur.next;
                        cur.next.prev = cur.prev;
                    }else {
                        // 刪除尾巴節(jié)點(diǎn)
                        //cur.next.prev = cur.next;
                        last = last.prev;
                    }
                }
                return;
            }
            cur = cur.next;
        }
    }

8.刪除所有值為key的節(jié)點(diǎn)

即上面刪除完第一個(gè)key的節(jié)點(diǎn)之后不跳出循環(huán),接著刪除。文章來源地址http://www.zghlxwxcb.cn/news/detail-794885.html

    @Override
    public void removeAllKey(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                if (cur == head) {
                    head = head.next;
                    if (head != null) {
                        head.prev = null;
                    }else {
                        //只有一個(gè)節(jié)點(diǎn) 且是需要?jiǎng)h除的節(jié)點(diǎn)
                        last = null;
                    }
                }else {
                    cur.prev.next = cur.next;
                    //刪除中間節(jié)點(diǎn)
                    if (cur.next != null) {
                        //cur.prev.next = cur.next;
                        cur.next.prev = cur.prev;
                    }else {
                        // 刪除尾巴節(jié)點(diǎn)
                        //cur.next.prev = cur.next;
                        last = last.prev;
                    }
                }
            }
            cur = cur.next;
        }
    }

9.雙鏈表是否包含值為key節(jié)點(diǎn)

    @Override
    public boolean contains(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

10.雙鏈表大小

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

11.清空雙鏈表

    @Override
    public void clear() {
        ListNode cur = head;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = null;
            cur.prev = null;
            cur = curNext;
        }
        this.head = null;
        this.last = null;
    }

12.打印雙鏈表

    @Override
    public void display() {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    }

到了這里,關(guān)于【Java數(shù)據(jù)結(jié)構(gòu) -- 實(shí)現(xiàn)雙鏈表的接口方法】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)之雙鏈表的相關(guān)知識(shí)點(diǎn)及應(yīng)用

    數(shù)據(jù)結(jié)構(gòu)之雙鏈表的相關(guān)知識(shí)點(diǎn)及應(yīng)用

    ?找往期文章包括但不限于本期文章中不懂的知識(shí)點(diǎn): 個(gè)人主頁 :我要學(xué)編程(?_?)-CSDN博客 所屬專欄 :數(shù)據(jù)結(jié)構(gòu) 目錄 雙鏈表的實(shí)現(xiàn)? 初始化雙鏈表? 在雙鏈表中尾插數(shù)據(jù)? 在雙鏈表中尾刪數(shù)據(jù) 在雙鏈表中頭插數(shù)據(jù)? 在雙鏈表中頭刪數(shù)據(jù)? 在雙鏈表中的指定位置之后插入

    2024年04月26日
    瀏覽(95)
  • 【數(shù)據(jù)結(jié)構(gòu)】 循環(huán)雙鏈表的基本操作 (C語言版)

    【數(shù)據(jù)結(jié)構(gòu)】 循環(huán)雙鏈表的基本操作 (C語言版)

    目錄 一、循環(huán)雙鏈表 1、循環(huán)雙鏈表的定義: 2、循環(huán)雙鏈表的優(yōu)缺點(diǎn): 二、循環(huán)雙鏈表的基本操作算法(C語言)? ??1、宏定義 ?2、創(chuàng)建結(jié)構(gòu)體 3、循環(huán)雙鏈表的初始化? 4、循環(huán)雙鏈表按位查找 5、循環(huán)雙鏈表插入 6、循環(huán)雙鏈表查找 7、循環(huán)雙鏈表刪除 8、求循環(huán)雙鏈表長(zhǎng)

    2024年01月22日
    瀏覽(99)
  • 【一起學(xué)數(shù)據(jù)結(jié)構(gòu)與算法】Java實(shí)現(xiàn)雙鏈表

    【一起學(xué)數(shù)據(jù)結(jié)構(gòu)與算法】Java實(shí)現(xiàn)雙鏈表

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。一般我們都構(gòu)造雙向循環(huán)鏈表。 打印雙鏈表非常簡(jiǎn)單,只需要單獨(dú)創(chuàng)一個(gè)結(jié)點(diǎn)

    2024年02月22日
    瀏覽(33)
  • 【玩轉(zhuǎn)408數(shù)據(jù)結(jié)構(gòu)】線性表——雙鏈表、循環(huán)鏈表和靜態(tài)鏈表(線性表的鏈?zhǔn)奖硎?下)

    【玩轉(zhuǎn)408數(shù)據(jù)結(jié)構(gòu)】線性表——雙鏈表、循環(huán)鏈表和靜態(tài)鏈表(線性表的鏈?zhǔn)奖硎?下)

    ? ? ? ? 在前面的學(xué)習(xí)中,我們已經(jīng)了解到了鏈表(線性表的鏈?zhǔn)酱鎯?chǔ))的一些基本特點(diǎn),并且深入的研究探討了單鏈表的一些特性,我們知道,單鏈表在實(shí)現(xiàn)插入刪除上,是要比順序表方便的,但是,單鏈表中每個(gè)結(jié)點(diǎn)僅存在一個(gè)指針指向其后續(xù)結(jié)點(diǎn),那么如果我們想要找

    2024年04月10日
    瀏覽(99)
  • 數(shù)據(jù)結(jié)構(gòu)——鏈表的實(shí)現(xiàn)(Java版)

    目錄 一、鏈表 二、代碼實(shí)現(xiàn) 1.創(chuàng)建結(jié)點(diǎn) 2.構(gòu)造函數(shù) 3.鏈表的相關(guān)屬性 4.添加虛擬節(jié)點(diǎn) 5.判斷鏈表是否為空 6.添加方法 (1)在頭部添加 (2)在尾部添加 (3)在索引位置添加 (4)對(duì)頭插法和尾插法代碼進(jìn)行簡(jiǎn)化(調(diào)用任意位置添加的方法) 7.打印鏈表(遍歷,重寫toString方

    2024年01月23日
    瀏覽(24)
  • java數(shù)據(jù)結(jié)構(gòu)與算法:雙鏈表 LinkedList
  • 【數(shù)據(jù)結(jié)構(gòu)】數(shù)組、雙鏈表代碼實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】數(shù)組、雙鏈表代碼實(shí)現(xiàn)

    ??????歡迎來到我的博客,你將找到有關(guān)如何使用技術(shù)解決問題的文章,也會(huì)找到某個(gè)技術(shù)的學(xué)習(xí)路線。無論你是何種職業(yè),我都希望我的博客對(duì)你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章,也歡迎在文章下方留下你的評(píng)論和反饋。我期待著與你分享知識(shí)、互

    2024年02月19日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表 && 雙鏈表(鏈?zhǔn)胶蛿?shù)組實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表 && 雙鏈表(鏈?zhǔn)胶蛿?shù)組實(shí)現(xiàn))

    ??? ??????? 歡迎來到小林的博客??! ?????????博客主頁:??小林愛敲代碼 ?????????博客專欄:?? 數(shù)據(jù)結(jié)構(gòu)與算法 ?????????社區(qū) :?? 進(jìn)步學(xué)堂 ?????????歡迎關(guān)注:??點(diǎn)贊??收藏??留言 今天給大家?guī)硭膫€(gè)內(nèi)容,一個(gè)

    2024年02月01日
    瀏覽(97)
  • 【算法基礎(chǔ)】數(shù)據(jù)結(jié)構(gòu)| 單鏈表+雙鏈表 代碼實(shí)現(xiàn)+圖解+原理

    【算法基礎(chǔ)】數(shù)據(jù)結(jié)構(gòu)| 單鏈表+雙鏈表 代碼實(shí)現(xiàn)+圖解+原理

    博主簡(jiǎn)介: 努力學(xué)習(xí)的預(yù)備程序媛一枚~ 博主主頁: @是瑤瑤子啦 所屬專欄: Java島冒險(xiǎn)記【從小白到大佬之路】 因?yàn)楝幀幾诱趥鋺?zhàn)藍(lán)橋杯和校內(nèi)ACM選拔賽,最近在學(xué)習(xí)算法相關(guān)的知識(shí)。我是借助 AcWing網(wǎng)站 來學(xué)習(xí)的,這篇文章是我學(xué)習(xí)就我學(xué)習(xí)內(nèi)容的一個(gè)筆記,其中的一些

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

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

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

    2024年01月24日
    瀏覽(639)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包