自定义实现LinkedList

LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。

每个链表存储了 first 和 last 指针:

transient Node<E> first;
transient Node<E> last;

自定义实现LinkedList_第1张图片
接下来是简单实现

package TestList.TestLinkedList;

/**
 * 自定义一个双向链表
 */
public class LinkedList01<E> {
    private Node first;
    private Node last;
    private int size;

    /**
     * []--> ["a","b","c"]
     */
    public void add(E obj) {

        Node node = new Node(obj);

        if (first == null) {
            first = node;
            last = node;
        } else {
            node.previous = last;
            node.next = null;
            last.next = node;
            last = node;
        }
        size++;
    }

    /**
     * 在指定位置插入元素
     * 如在index=1处插入"qin",["a","b","c"]-->["a","qin","b","c"]
     * 都是在前面插入,若想在最后位置插入,直接调用add(int index)即可
     */
    public void add(E obj,int index){

        rangeCheck(index);
        Node node = new Node(obj);
        Node temp = getNode(index);
        Node up = temp.previous;

        if (up != null ) {
            node.previous = up;
            node.next = temp;
            up.next = node;
            temp.previous = node;
        }
        if (index == 0) {
            node.next = temp;
            temp.previous = node;
            first = node;
        }

        size++;
    }

    public void rangeCheck(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException("索引出界" + index);
        }
    }

    private Node getNode(int index) {
        rangeCheck(index);
        Node temp;
        /**
         * 二分查找提高效率
         */
        if (index <= (size >> 1)) {
            temp = first;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }
        } else {
            temp = last;
            for (int i = size - 1; i > index; i--) {
                temp = temp.previous;
            }
        }
        return temp;
    }

    public E get(int index) {
        Node temp = getNode(index);//直接调用
        return temp != null ? ((E) temp.element) :null;
    }

    /**
     * ["a","b","c"]--["a","b"]
     */
    public void remove(int index) {
        rangeCheck(index);
        Node temp = getNode(index);
        Node up = temp.previous;//上一个节点
        Node down = temp.next;//下一个节点
        if (up != null) {
            up.next = down;
        }
        if (down != null) {
            down.previous = up;
        }
        if (index == 0){
            first = down;
        }
        if (index == size - 1){
            last = up;
        }
        size--;
//        temp = null;java自动回收
    }

    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        Node temp = first;
        while (temp != null) {
            sb.append(temp.element + ",");
            temp = temp.next;
        }

        sb.setCharAt(sb.length() - 1, ']');
        return sb.toString();
    }

    public static void main(String[] args) {
        LinkedList01<String> list01 = new LinkedList01();
        list01.add("a");
        list01.add("b");
        list01.add("c");
        list01.add("d");
        list01.add("e");

        System.out.println(list01);

        System.out.println(list01.get(4));
        list01.remove(4);
        System.out.println(list01);
        list01.add("qin",0);
        System.out.println(list01);
    }

}

你可能感兴趣的:(java学习笔记)