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

java數(shù)據(jù)結(jié)構(gòu)實現(xiàn)雙向鏈表功能

 更新時間:2021年11月26日 14:34:53   作者:m0_38025927  
這篇文章主要為大家詳細介紹了java數(shù)據(jù)結(jié)構(gòu)實現(xiàn)雙向鏈表功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

雙向鏈表實現(xiàn)

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個結(jié)點開始,都可以很方便地訪問它的前驅(qū)結(jié)點后繼結(jié)點。

注意:在操作雙向鏈表時,不要去移動指向前驅(qū)節(jié)點和后繼節(jié)點的指針,而是重新定義指向頭尾的指針進行移動。*

環(huán)境

IDEA

自定義操作接口

雙向鏈表。

public interface MyList<E> {
    void add(E node);
    E get(int index);
    E remove(int index);
    int size();
}

實現(xiàn)類

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

    /**
     * 定義雙向鏈表節(jié)點
     */
    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é)點添加到尾部
     *
     * @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) {
        //校驗index是否合法
        checkIndex(index);
        //獲取index元素
        return getNode(index).item;
    }

    /**
     * 校驗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é)點
        if (node.prev == null) {
            this.head = node.next;
        } else {
            node.prev.next = node.next;
            node.prev = null;
        }
        //判斷是否為尾節(jié)點
        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));
        }
    }

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • IntelliJ IDEA使用maven實現(xiàn)tomcat的熱部署

    IntelliJ IDEA使用maven實現(xiàn)tomcat的熱部署

    這篇文章主要介紹了IntelliJ IDEA使用maven實現(xiàn)tomcat的熱部署,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java內(nèi)部類和異常類的概念以及使用

    Java內(nèi)部類和異常類的概念以及使用

    這篇文章主要介紹了Java內(nèi)部類和異常類的概念以及使用,文中有非常詳細的代碼以及注釋,適合正在學習java基礎(chǔ)的同學們使用,需要的朋友可以參考下
    2021-04-04
  • Java異常架構(gòu)和異常關(guān)鍵字圖文詳解

    Java異常架構(gòu)和異常關(guān)鍵字圖文詳解

    Java異常是Java提供的一種識別及響應(yīng)錯誤的一致性機制,下面這篇文章主要給大家介紹了關(guān)于Java異常架構(gòu)和異常關(guān)鍵字的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • MyBatis開啟二級緩存實現(xiàn)過程解析

    MyBatis開啟二級緩存實現(xiàn)過程解析

    這篇文章主要介紹了MyBatis開啟二級緩存實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • springcloud?gateway無法路由問題的解決

    springcloud?gateway無法路由問題的解決

    gateway網(wǎng)關(guān)的重要作用之一便是進行路由轉(zhuǎn)發(fā)工作,下面這篇文章主要給大家介紹了關(guān)于springcloud?gateway無法路由問題的解決方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • springmvc學習筆記-返回json的日期格式問題的解決方法

    springmvc學習筆記-返回json的日期格式問題的解決方法

    本篇文章主要介紹了springmvc學習筆記-返回json的日期格式問題的解決方法,解決了日期格式的輸出,有興趣的可以了解一下。
    2017-01-01
  • flatten-maven-plugin使用教程

    flatten-maven-plugin使用教程

    這篇文章主要介紹了flatten-maven-plugin使用,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot下Mybatis的緩存的實現(xiàn)步驟

    SpringBoot下Mybatis的緩存的實現(xiàn)步驟

    這篇文章主要介紹了SpringBoot下Mybatis的緩存的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java中Scanner用法實例解析

    Java中Scanner用法實例解析

    Scanner?指的是java.util包下的Scanner類,可以接收控制臺輸入的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中Scanner用法實例的相關(guān)資料,文中通過實例代碼以及圖文介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • java實現(xiàn)簡單的客戶信息管理系統(tǒng)

    java實現(xiàn)簡單的客戶信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的客戶信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論