• 自己根据java的LinkedList源码编写的一个简单的LinkedList实现


    自己实现了一个简单的LinkedList

    /**
     * Create by andy on 2018-07-03 11:44
     * 根据 {@link java.util.LinkedList}源码 写了一个简单的实现,方便理解设计流程
     * 该类是线程不安全的
     */
    public class FrameLinkedList<E> {
        private Node<E> first;
        private Node<E> last;
        private int size;
    
        public int getSize() {
            return size;
        }
    
        public E getFirst() {
            if (first == null)
                return null;
            return first.item;
        }
    
        public E getLast() {
            if (last == null)
                return null;
            return last.item;
        }
    
        /**
         * 根据元素位置取元素的值
         * 从这个例子中就可以看出来,为什么LinkedList获取元素比较慢,因为每次取出元素都有进行一次循环!!!!
         *
         * @param index
         * @return
         */
        public E get(int index) {
            if (index < 0)
                throw new IllegalArgumentException("参数不能小于0");
            if (index >= size)
                throw new IllegalArgumentException("参数太大了,当前集合最大长度为:" + size);
    
            //如果索引小于当前元素个数的一半,就从头部开始循环,否则从尾部开始循环
            Node<E> node = first;
            if (index < size >> 1) {
                //把头给节点,便于下面递归循环
                for (int i = 0; i < index; i++) {
                    node = node.next;
                }
            } else {
                //把尾给节点,便于下面递归循环
                node = last;
                for (int i = size - 1; i > index; i--) {
                    node = node.prev;
                }
            }
            return node.item;
        }
    
        public void add(E e) {
            if (size == 0) {
                //第一次添加对象
                Node<E> curr = new Node<>(e, null, null);
                curr.item = e; //当前对象
                first = curr;
                last = curr;
            } else {
                Node<E> curr = new Node<>(e, last, null);
                last.next = curr;
                last = curr;
            }
            size++;
        }
    
        public boolean remove(E e) {
            if (size == 0) return false;
            //分两种来处理防止e为null的时候出现空指针异常
            if (e == null) {
                for (Node<E> n = first; n != null; n = n.next) {
                    if (n.item == null) {
                        remove(n);
                        return true;
                    }
                }
            } else {
                for (Node<E> n = first; n != null; n = n.next) {
                    if (e.equals(n.item)) {
                        remove(n);
                        return true;
                    }
                }
            }
            return false;
        }
    
        private void remove(Node<E> node) {
            Node<E> prev = node.prev;
            Node<E> next = node.next;
            if (prev == null) {
                //移除的是第一个
                node.next = null;
                next.prev = null;
                first = next;
            } else if (next == null) {
                //移除的是最后一个
                node.prev = null;
                prev.next = null;
                last = prev;
            } else {
                //移除的是中间
                node.prev = null;
                node.next = null;
    
                prev.next = next;
                next.prev = prev;
            }
            node.item = null; //便于回收item
            size--;
        }
    
        private static class Node<E> {
            E item; //当前对象
            Node<E> prev; //上一个对象的Node
            Node<E> next; //下一个对象的Node
    
            Node(E item, Node<E> prev, Node<E> next) {
                this.item = item;
                this.prev = prev;
                this.next = next;
            }
        }
    
        public static void main(String[] args) {
            FrameLinkedList<String> list = new FrameLinkedList<>();
            list.add("a1");
            list.add("a2");
            list.add("a3");
            list.add("a4");
            list.add("a5");
            for (int i = 0; i < list.getSize(); i++) {
                System.out.println(list.get(i));
            }
            System.out.println("-------");
            list.remove(list.get(4));
            for (int i = 0; i < list.getSize(); i++) {
                System.out.println(list.get(i));
            }
    
        }
    }
    
    
  • 相关阅读:
    Django入门
    Python从入门到放弃
    Python中的元类(metaclass)
    蓝鲸gse启动失败
    VS2019添加微软ReportViewer
    DevExpress WinForms各版本与 .NET、Visual Studio 的版本兼容性
    SQL语句查询每个分组的前N条记录的实现方法
    如何查看Windows安装版本号
    学习webpack
    Python3.x将代码打包成exe程序并添加图标
  • 原文地址:https://www.cnblogs.com/andysd/p/9258052.html
Copyright © 2020-2023  润新知