码迷,mamicode.com
首页 > 编程语言 > 详细

Java如何实现LinkedList按索引下标进行插入

时间:2021-02-24 13:21:22      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sse   数据   check   div   next   exce   exception   turn   lse   

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++;
    }
     

 

Java如何实现LinkedList按索引下标进行插入

标签:sse   数据   check   div   next   exce   exception   turn   lse   

原文地址:https://www.cnblogs.com/cckong/p/14438966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!