欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

環(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);
    }

    /**
     * 添加一個元素到尾部
     *
     * @param e
     */
    private void linkLast(E e) {
        //獲取tail
        Node<E> node = this.tail;
        //創(chuàng)建一個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;
    }

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

    }

測試方法

  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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • swagger的請求參數(shù)不顯示,@Apimodel的坑點(diǎn)及解決

    swagger的請求參數(shù)不顯示,@Apimodel的坑點(diǎn)及解決

    這篇文章主要介紹了swagger的請求參數(shù)不顯示,@Apimodel的坑點(diǎn)及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java之Arrays的各種功能和用法總結(jié)

    Java之Arrays的各種功能和用法總結(jié)

    數(shù)組在?Java?中是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲和操作大量數(shù)據(jù)。Arrays?是我們在處理數(shù)組時的一把利器。它提供了豐富的方法和功能,使得數(shù)組操作變得更加簡單、高效和可靠。接下來我們一起看看?Arrays?的各種功能和用法,,需要的朋友可以參考下
    2023-05-05
  • springboot2整合redis使用lettuce連接池的方法(解決lettuce連接池?zé)o效問題)

    springboot2整合redis使用lettuce連接池的方法(解決lettuce連接池?zé)o效問題)

    這篇文章主要介紹了springboot2整合redis使用lettuce連接池(解決lettuce連接池?zé)o效問題),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java線程池使用與原理詳解

    Java線程池使用與原理詳解

    這篇文章主要為大家詳細(xì)介紹了Java線程池使用與原理的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 詳解Spring Boot整合Mybatis實(shí)現(xiàn) Druid多數(shù)據(jù)源配置

    詳解Spring Boot整合Mybatis實(shí)現(xiàn) Druid多數(shù)據(jù)源配置

    本篇文章主要介紹了詳解Spring Boot整合Mybatis實(shí)現(xiàn) Druid多數(shù)據(jù)源配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Java Filter過濾器的使用教程

    Java Filter過濾器的使用教程

    Filter也稱之為過濾器,它是Servlet技術(shù)中最實(shí)用的技術(shù),Web開發(fā)人員通過Filter技術(shù),對web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能
    2023-01-01
  • java多線程Future和Callable類示例分享

    java多線程Future和Callable類示例分享

    JAVA多線程實(shí)現(xiàn)方式主要有三種:繼承Thread類、實(shí)現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程。其中前兩種方式線程執(zhí)行完后都沒有返回值,只有最后一種是帶返回值的。今天我們就來研究下Future和Callable的實(shí)現(xiàn)方法
    2016-01-01
  • java中Pulsar?InterruptedException?異常

    java中Pulsar?InterruptedException?異常

    這篇文章主要為大家介紹了java中Pulsar?InterruptedException?異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java冒泡排序及優(yōu)化介紹

    Java冒泡排序及優(yōu)化介紹

    大家好,本篇文章主要講的是Java冒泡排序及優(yōu)化介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Spring中的@RefreshScope注解作用

    Spring中的@RefreshScope注解作用

    這篇文章主要介紹了Spring中的@RefreshScope注解作用詳解,@RefreshScope注解是Spring Cloud中的一個重要注解,用于實(shí)現(xiàn)動態(tài)刷新配置的功能,當(dāng)我們在應(yīng)用程序中使用@Value注解獲取配置屬性時,如果配置發(fā)生變化,需要重啟應(yīng)用程序才能生效,需要的朋友可以參考下
    2023-10-10

最新評論