zoukankan      html  css  js  c++  java
  • 链表03--[双向链表&&单向循环链表&&双向循环链表&&静态链表]

    1.双向链表

    java官方就是双向链表

    1.1双向链表-只有一个元素

    1.2双向链表-node方法

    /**
         * 获取index位置对应的节点对象
         * @param index
         * @return
         */
        private Node<E> node(int index) {
            rangeCheck(index);
            
            if (index < (size >> 1)) {
                Node<E> node = first;
                for (int i = 0; i < index; i++) {
                    node = node.next;
                }
                return node;
            } else {
                Node<E> node = last;
                for (int i = size - 1; i > index; i--) {
                    node = node.prev;
                }
                return node;
            }
        }
    View Code

    1.3双向链表-add(int index,E element)

    @Override
        public void add(int index, E element) {
            rangeCheckForAdd(index);
    
            // size == 0
            // index == 0
            if (index == size) { // 往最后面添加元素
                Node<E> oldLast = last;
                last = new Node<>(oldLast, element, null);
                if (oldLast == null) { // 这是链表添加的第一个元素
                    first = last;
                } else {
                    oldLast.next = last;
                }
            } else {
                Node<E> next = node(index); 
                Node<E> prev = next.prev; 
                Node<E> node = new Node<>(prev, element, next);
                next.prev = node;
                
                if (prev == null) { // index == 0
                    first = node;
                } else {
                    prev.next = node;
                }
            }
            
            size++;
        }
    View Code

    1.4双向链表-删除操作clear()

    java如何删除对象

    1.看一个对象是否有引用

    2.看这个引用是否是gc.root对象

    2.1被栈(局部变量)指针指向的对象为gc.root对象

    @Override
        public void clear() {
            size = 0;
            first = null;
            last = null;
        }
    View Code

    1.5双向链表--remove(int index)

        @Override
        public E remove(int index) {
            rangeCheck(index);
    
            Node<E> node = node(index);
            Node<E> prev = node.prev;
            Node<E> next = node.next;
            
            if (prev == null) { // index == 0
                first = next;
            } else {
                prev.next = next;
            }
            
            if (next == null) { // index == size - 1
                last = prev;
            } else {
                next.prev = prev;
            }
            
            size--;
            return node.element;
        }
    View Code

    1.6双向链表VS单向链表

    1.7双向链表VS动态数组

    1.8LinkedList源码分析

     2.单向循环链表

     2.1单向循环链表--只有一个节点

     2.2单向循环链表--add(int index,E element)

        @Override
        public void add(int index, E element) {
            rangeCheckForAdd(index);
            
            if (index == 0) {
                Node<E> newFirst = new Node<>(element, first);
                // 拿到最后一个节点
                Node<E> last = (size == 0) ? newFirst : node(size - 1);
                last.next = newFirst;
                first = newFirst;
            } else {
                Node<E> prev = node(index - 1);
                prev.next = new Node<>(element, prev.next);
            }
            size++;
        }
    View Code

    2.3单向循环链表--remove(int index)

        @Override
        public E remove(int index) {
            rangeCheck(index);
            
            Node<E> node = first;
            if (index == 0) {
                if (size == 1) {
                    first = null;
                } else {
                    Node<E> last = node(size - 1);
                    first = first.next;
                    last.next = first;
                }
            } else {
                Node<E> prev = node(index - 1);
                node = prev.next;
                prev.next = node.next;
            }
            size--;
            return node.element;
        }
    View Code

    3.双向循环链表

     3.1双向循环链表--只有一个节点

     3.2双向循环链表--add(int index,E element)

        @Override
        public void add(int index, E element) {
            rangeCheckForAdd(index);
    
            // size == 0
            // index == 0
            if (index == size) { // 往最后面添加元素
                Node<E> oldLast = last;
                last = new Node<>(oldLast, element, first);
                if (oldLast == null) { // 这是链表添加的第一个元素
                    first = last;
                    first.next = first;
                    first.prev = first;
                } else {
                    oldLast.next = last;
                    first.prev = last;
                }
            } else {
                Node<E> next = node(index); 
                Node<E> prev = next.prev; 
                Node<E> node = new Node<>(prev, element, next);
                next.prev = node;
                prev.next = node;
                
                if (next == first) { // index == 0
                    first = node;
                }
            }
            
            size++;
        }
    View Code

    3.3双向循环链表--remove(int index)

    @Override
        public E remove(int index) {
            rangeCheck(index);
            return remove(node(index));
        }
        
        private E remove(Node<E> node) {
            if (size == 1) {
                first = null;
                last = null;
            } else {
                Node<E> prev = node.prev;
                Node<E> next = node.next;
                prev.next = next;
                next.prev = prev;
                
                if (node == first) { // index == 0
                    first = next;
                }
                
                if (node == last) { // index == size - 1
                    last = prev;
                }
            }
            
            size--;
            return node.element;
        }
    View Code

    4.静态链表

     5.ArrayList能否进一步优化

  • 相关阅读:
    js分页--存储数据并进行分页
    纯CSS多级菜单
    ini文件操作
    XML文件数据操作
    身份证号码验证
    将DataSet(DataTable)转换成JSON格式(生成JS文件存储)
    将JSON(List集合)转成DataSet(DataTable)
    js打印(控件)及多种方式
    了解切面编程思想
    20190429版本-测试过程回溯
  • 原文地址:https://www.cnblogs.com/ggnbnb/p/12179415.html
Copyright © 2011-2022 走看看