zoukankan      html  css  js  c++  java
  • Java如何实现LinkedList按索引下标进行插入

    public static void main(String[] args) {
            LinkedList<Integer> integers = new LinkedList<>();
            integers.add(1);
            integers.add(8);
            integers.add(1,3);
            for (Integer t : integers) {
                System.out.print(t+" ");
            }
        }

    看到这个例子 大家可以猜一下会不会报错。

    如果不会报错 输出的是什么呢?

    答案就是

    我们学过数据结构都知道 链表不是只能尾插吗

    那么我们刨根问底这个add的重载方法的源码

    public void add(int index, E element) {
            checkPositionIndex(index);//根据下面1 2两个方法 发现如果越界会抛出越界异常
    
            if (index == size)
                linkLast(element);//当插入元素下标为size 直接调3 直接插入尾巴
            else
                linkBefore(element, node(index));//调用5前先调用4 找到所在下标的那个结点succ。在5里新建一个结点 前节点为succ的前结点 后见点为succ。
        }
    
    //1
    private void checkPositionIndex(int index) {
            if (!isPositionIndex(index))
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        }
    
    //2
    private boolean isPositionIndex(int index) {
            return index >= 0 && index <= size;
        }
    
    //3
     void linkLast(E e) {
            final Node<E> l = last;
            final Node<E> newNode = new Node<>(l, e, null);
            last = newNode;
            if (l == null)
                first = newNode;
            else
                l.next = newNode;
            size++;
            modCount++;
        }
    
    //4 
     Node<E> node(int index) {
            // assert isElementIndex(index);
            //这里很巧妙的利用了双向链表的特点 前1/2从前开始找 后1/2从后向前
            if (index < (size >> 1)) {
                Node<E> x = first;
                for (int i = 0; i < index; i++)
                    x = x.next;
                return x;
            } else {
                Node<E> x = last;
                for (int i = size - 1; i > index; i--)
                    x = x.prev;
                return x;
            }
        }
    
    
    //5
    void linkBefore(E e, Node<E> succ) {
            // assert succ != null;
            final Node<E> pred = succ.prev;
            final Node<E> newNode = new Node<>(pred, e, succ);
            succ.prev = newNode;
            if (pred == null)
                first = newNode;
            else
                pred.next = newNode;
            size++;
            modCount++;
        }
         
  • 相关阅读:
    DS博客作业08--课程总结
    DS博客作业07-----查找
    DS博客作业06--图
    DS博客作业05--树
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
    DS博客作业05--树
    DS博客作业03--栈和队列
    DS博客作业02--线性表
  • 原文地址:https://www.cnblogs.com/cckong/p/14438966.html
Copyright © 2011-2022 走看看