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

2021-03-01 13:29

阅读:632

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

public static void main(String[] args) {
        LinkedList 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 l = last;
        final Node newNode = new Node(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

//4 
 Node node(int index) {
        // assert isElementIndex(index);
        //这里很巧妙的利用了双向链表的特点 前1/2从前开始找 后1/2从后向前
        if (index > 1)) {
            Node x = first;
            for (int i = 0; i )
                x = x.next;
            return x;
        } else {
            Node x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }


//5
void linkBefore(E e, Node succ) {
        // assert succ != null;
        final Node pred = succ.prev;
        final Node 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


评论


亲,登录后才可以留言!