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; //返回旧结点的值
}
标签:index,结点,null,LinkedList,next,element,prev
From: https://www.cnblogs.com/xiaomitu/p/17135180.html