List接口:
public interface IMyList<E> {
boolean add(E e);
void add(int index, E e);
int size();
boolean isEmpty();
}
LinkList实现:
public class MyLinkedList<E> implements IMyList<E> {
private int size; //总长度
private Node<E> head; //头结点
private Node<E> tail; //尾节点
public MyLinkedList() {
}
@Override
public boolean add(E e) {
linkTail(e);
return true;
}
@Override
public void add(int index, E e) {
if (index == size){
linkTail(e);
} else {
Node<E> node = getNodeByIndex(index);
linkBefore(node, e);
}
}
@Override
public int size() {
return this.size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
private void linkTail(E e){
Node<E> newNode = new Node<>(e, null, tail);
if (tail == null){
tail = newNode;
head = newNode;
}
else {
tail.next = newNode;
tail = newNode;
}
size++;
}
private void linkBefore(Node<E> node, E e){
Node<E> newNode = new Node<E>(e, node, node.prev);
if (node.prev == null){
head = newNode;
} else {
node.prev.next = newNode;
}
size++;
}
private Node<E> getNodeByIndex(int index){
Node<E> node;
if (index > (size >> 1)){
node = tail;
for (int i=size-1; i>index; i--){
node = node.prev;
}
} else {
node = head;
for (int i=0; i<index; i++){
node = node.next;
}
}
return node;
}
//内部静态节点类,包含节点的值、上一个和下一个节点的引用
private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
public Node(E item, Node<E> next, Node<E> prev) {
this.item = item;
this.next = next;
this.prev = prev;
}
}
}