LinkedList

LinkedList

LinkerList使用的是双向链表,其基本的增删改查如下:

增加

示例代码如下:

List<Object> list=new LinkedList<>();
list.add(Object e);	//默认创建一个结点添加元素
list.add(int index, Object element);	//在index下标添加元素

源码实现如下:

public void add(int index, E element) {
	checkPositionIndex(index);			//检查要插入的位置是否越界
    if (index == size)				    //如果下标是等于当前链表大小,则进行尾插
		linkLast(element);
    else
         linkBefore(element, node(index));	//否则指定位置插入
}

删除

示例代码如下:

list.remove(Object o);	//删除指定元素的结点
list.remove(int index);	//删除指定位置的结点

源码实现如下:

public boolean remove(Object o) {
    if (o == null) {	、//判断要删除的对象是否为空对象
        for (Node<E> x = first; x != null; x = x.next) {
            if (x.item == null) {	//遍历整个链表,如果有空对象这个结点,则执行unlink()方法
                unlink(x);
                return true;
            }
        }
    } else {
        //如果要删除的结点不是空结点,则遍历整个链表
        for (Node<E> x = first; x != null; x = x.next) {
            //判断链表中是否有和要删除值一样的结点,右则执行unlink()方法
            if (o.equals(x.item)) {
                unlink(x);
                return true;
            }
        }
    }
    return false;
}

E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;

        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }

修改

示例代码如下:

list.set(int index, Object e);	//在指定index位置修改新的值为e

源代码实现如下:

public E set(int index, E element) {
    checkElementIndex(index);		//检查是否越界
    Node<E> x = node(index);		//找到需要修改的结点
    E oldVal = x.item;			    //将该结点的值替换为需要更新的值
    x.item = element;			    
    return oldVal;				    //返回旧结点的值
}
posted @ 2023-02-19 17:36  Cherry_Shen  阅读(77)  评论(0)    收藏  举报