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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM