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

Java如何實(shí)現(xiàn)雙向鏈表功能

 更新時(shí)間:2021年11月26日 09:50:12   作者:m0_38025927  
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。一般我們都構(gòu)造雙向循環(huán)鏈表

雙向鏈表實(shí)現(xiàn)

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。注意:在操作雙向鏈表時(shí),不要去移動(dòng)指向前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的指針,而是重新定義指向頭尾的指針進(jìn)行移動(dòng)。*

環(huán)境

IDEA

自定義操作接口

雙向鏈表。

public interface MyList<E> {

    void add(E node);

    E get(int index);

    E remove(int index);

    int size();
}

實(shí)現(xiàn)類

public class MyDoublyLinkList<E> implements MyList<E> {

    /**
     * 定義雙向鏈表節(jié)點(diǎn)
     */
    class Node<E> {
        Node<E> prev;
        E item;
        Node<E> next;

        public Node(Node<E> prev, E item, Node<E> next) {
            this.prev = prev;
            this.item = item;
            this.next = next;
        }
    }

    private Node<E> head;
    private Node<E> tail;
    private int size;

    /**
     * 將節(jié)點(diǎn)添加到尾部
     *
     * @param item
     * @return
     */
    @Override
    public void add(E item) {
        this.linkLast(item);
    }

    /**
     * 添加一個(gè)元素到尾部
     *
     * @param e
     */
    private void linkLast(E e) {
        //獲取tail
        Node<E> node = this.tail;
        //創(chuàng)建一個(gè)node
        Node<E> newNode = new Node<>(node, e, null);
        this.tail = newNode;
        if (node == null)
            this.head = newNode;
        else
            node.next = newNode;
        size++;
    }

    /**
     * 獲取指定位置元素
     * @param index
     * @return
     */

    @Override
    public E get(int index) {
        //校驗(yàn)index是否合法
        checkIndex(index);
        //獲取index元素
        return getNode(index).item;
    }

    /**
     * 校驗(yàn)index合法性
     *
     * @param index
     */
    private void checkIndex(int index) {
        if (!(index >= 0 && index < this.size))
            throw new IndexOutOfBoundsException(String.format("index out of bounds,index:%s,size:%s", index, this.size));
    }

    /**
     * 獲取node
     *
     * @param index
     * @return
     */
    private Node<E> getNode(int index) {
        if (index > (size >> 1)) {
            Node<E> node = this.tail;
            //從tail向前遍歷
            for (int i = size - 1; i > index; i--) {
                node = node.prev;
            }
            return node;
        } else {
            //從head向后遍歷
            Node<E> node = this.head;
            for (int i = 0; i < index; i++) {
                node = node.next;
            }
            return node;
        }
    }

    /**
     * 刪除指定位置元素
     *
     * @param index
     * @return
     */
    @Override
    public E remove(int index) {
        //判斷index合法性
        this.checkIndex(index);
        Node<E> node = getNode(index);
        E e = node.item;
        //判斷是否為頭節(jié)點(diǎn)
        if (node.prev == null) {
            this.head = node.next;
        } else {
            node.prev.next = node.next;
            node.prev = null;
        }
        //判斷是否為尾節(jié)點(diǎn)
        if (node.next == null) {
            this.tail = node.next;
        } else {
            node.next.prev = node.prev;
            node.next = null;
        }
        node.item = null;
        size--;
        return e;
    }

    /**
     * 獲取鏈表長(zhǎng)度
     *
     * @return
     */
    @Override
    public int size() {
        return this.size;
    }

    }

測(cè)試方法

  public static void main(String[] args) {
        MyList<String> stringMyList = new MyDoublyLinkList<>();
        System.out.println(stringMyList.size());
        stringMyList.add("a");
        stringMyList.add("b");
        stringMyList.add("c");
        stringMyList.add("d");
        System.out.println(stringMyList.size());
        String re = stringMyList.remove(1);
        System.out.println(re);
        for (int i = 0; i < stringMyList.size(); i++) {
            System.out.println(stringMyList.get(i));
        }
    }

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

相關(guān)文章

  • SpringMVC MVC架構(gòu)原理及實(shí)現(xiàn)方法詳解

    SpringMVC MVC架構(gòu)原理及實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了SpringMVC MVC架構(gòu)原理及實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • python實(shí)戰(zhàn)之德州撲克第一步-發(fā)牌

    python實(shí)戰(zhàn)之德州撲克第一步-發(fā)牌

    這篇文章主要介紹了python實(shí)戰(zhàn)之德州撲克第一步-發(fā)牌,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java中啟動(dòng)jar包命令舉例詳解

    Java中啟動(dòng)jar包命令舉例詳解

    這篇文章主要介紹了Java中啟動(dòng)jar包命令的相關(guān)資料,文中介紹了在Windows和Linux環(huán)境下啟動(dòng)和運(yùn)行Java程序的方法,包括使用`java?-jar`和`javaw`命令啟動(dòng),以及如何在后臺(tái)運(yùn)行程序、重定向輸出和錯(cuò)誤信息、以及如何停止程序,需要的朋友可以參考下
    2024-12-12
  • Java中EnumMap和EnumSet枚舉操作類的簡(jiǎn)單使用詳解

    Java中EnumMap和EnumSet枚舉操作類的簡(jiǎn)單使用詳解

    這篇文章主要介紹了Java中EnumMap和EnumSet枚舉操作類的簡(jiǎn)單使用詳解,EnumMap是Map接口的一種實(shí)現(xiàn),專門用于枚舉類型的鍵,所有枚舉的鍵必須來自同一個(gè)枚舉?EnumMap不允許鍵為空,允許值為空,需要的朋友可以參考下
    2023-11-11
  • java8異步調(diào)用如何使用才是最好的方式

    java8異步調(diào)用如何使用才是最好的方式

    異步調(diào)用主要用于當(dāng)前程序的執(zhí)行不用等待調(diào)用方法執(zhí)行結(jié)束就可以繼續(xù)執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于java8異步調(diào)用如何使用才是最好的方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 關(guān)于Java中的可見性和有序性問題

    關(guān)于Java中的可見性和有序性問題

    這篇文章主要介紹了關(guān)于Java中的可見性和有序性問題,Java在誕生之初就支持多線程,自然也有針對(duì)這三者的技術(shù)方案,今天就學(xué)習(xí)一下Java如何解決其中的可見性和有序性導(dǎo)致的問題,需要的朋友可以參考下
    2023-08-08
  • java 獲取HttpRequest Header的幾種方法(必看篇)

    java 獲取HttpRequest Header的幾種方法(必看篇)

    下面小編就為大家?guī)硪黄猨ava 獲取HttpRequest Header的幾種方法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • 淺談Java 中的單元測(cè)試

    淺談Java 中的單元測(cè)試

    這篇文章主要介紹了Java 中的單元測(cè)試的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • 詳解Spring-Boot中如何使用多線程處理任務(wù)

    詳解Spring-Boot中如何使用多線程處理任務(wù)

    本篇文章主要介紹了詳解Spring-Boot中如何使用多線程處理任務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 親測(cè)解決,nacos下線失敗問題

    親測(cè)解決,nacos下線失敗問題

    這篇文章主要介紹了親測(cè)解決,nacos下線失敗問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

三门峡市| 龙南县| 新竹市| 北碚区| 中牟县| 永泰县| 衡阳县| 永泰县| 汶上县| 依兰县| 河池市| 阳高县| 南阳市| 林西县| 新津县| 额济纳旗| 大同县| 瑞昌市| 定结县| 临西县| 察雅县| 长武县| 日喀则市| 琼海市| 嘉禾县| 疏勒县| 额济纳旗| 沂南县| 德化县| 江源县| 阳曲县| 柯坪县| 拉萨市| 镇安县| 望城县| 义马市| 镇平县| 板桥市| 南丰县| 铜川市| 博湖县|