java版Spring Cloud+SpringBoot+mybatis+uniapp微服務架構之 java 雙向連結串列實現

JIAN2發表於2021-11-26

雙向連結串列實現
雙向連結串列也叫雙連結串列,是連結串列的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。
注意:在操作雙向連結串列時,不要去移動指向前驅節點和後繼節點的指標,而是重新定義指向頭尾的指標進行移動。

需要框架原始碼的朋友可以看我個人簡介聯絡我。


java版Spring Cloud+SpringBoot+mybatis+uniapp微服務架構之 java 雙向連結串列實現

環境
IDEA

自定義操作介面

雙向連結串列。

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


實現類

public class MyDoublyLinkList<E> implements MyList<E> {
    /**
     * 定義雙向連結串列節點
     */
    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;
    /**
     * 將節點新增到尾部
     *
     * @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;
        //建立一個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;
        //判斷是否為頭節點
        if (node.prev == null) {
            this.head = node.next;
        } else {
            node.prev.next = node.next;
            node.prev = null;
        }
        //判斷是否為尾節點
        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));
        }
    }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006413/viewspace-2844244/,如需轉載,請註明出處,否則將追究法律責任。

相關文章