标签:yun void 增加 http new this 链接 code src
public class LinkedList<E> extends AbstractList<E> {
private Node<E> first;
//增加last节点
private Node<E> last;
private static class Node<E> {
E element;
//增加上一个节点
Node<E> prev;
Node<E> next;
public Node(Node<E> prev, E element, Node<E> next) {
this.prev = prev;
this.element = element;
this.next = next;
}
}
}
tips:乘除法较慢,我们使用位运算来代替,右移一位就相当于/2,反正,就*2
例如 seize>>1 就等价于size/2
private Node<E> node(int index) {
rangeCheck(index);
// 判断节点是在链表前一半还是后一半
if (index < (size >> 1)) {
Node<E> node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
} else {
Node<E> node = last;
for (int i = size - 1; i > index; i--) {
node = node.prev;
}
return node;
}
}
public void clear() {
size = 0;
first = null;
last = null;
}
newNode.next=prev.next;
newNode.prev=prev;
oldNode=prev.next;
oldNode.prev=newNode;
prev.next=newNode;
头尾节点的情况
public void add(int index, E element) {
rangeCheckForAdd(index);
// 往最后面添加元素
if (index == size) {
Node<E> oldLast = last;
last = new Node<>(oldLast, element, null);
// 这是链表添加的第一个元素
if (oldLast == null) {
first = last;
} else {
oldLast.next = last;
}
} else {
//插入位置的原节点,即为新节点的next节点。
Node<E> next = node(index);
//新添加节点的上一个节点,即为该位置原节点的上一个节点。
Node<E> prev = next.prev;
//创建新添加节点。
Node<E> node = new Node<>(prev, element, next);
//原节点的上一个节点,为新添加节点。
next.prev = node;
// index == 0
if (prev == null) {
first = node;
} else {
//原节点上一个节点的next,即为新添加节点。
prev.next = node;
}
}
size++;
}
标签:yun void 增加 http new this 链接 code src
原文地址:https://www.cnblogs.com/bianzhuo/p/13488243.html