节点定义
public class Node {
Node previous;
Node next;
Object element;
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
public Node(Object element) {
super();
this.element = element;
}
}
双向链表定义
属性
public class MyLinkedList<E> {
private Node first;
private Node last;
private int size;
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
Node temp = first;
while (temp != null) {
sb.append(temp.element + ",");
temp = temp.next;
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
}
索引越界检查
private void checkRange(int index) {
if (index < 0 || index > size ) {
throw new RuntimeException("索引不合法:" + index);
}
}
查询指定索引节点
private Node getNode(int index) {
checkRange(index);
if (index < (size >> 1)) {
Node temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return temp;
} else {
Node temp = last;
for (int i = size - 1; i > index; i--) {
temp = temp.previous;
}
return temp;
}
}
末尾增加
public void add(E element) {
Node node = new Node(element);
if (first == null) {
first = node;
last = node;
} else {
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
索引位置增加
public void add(E element, int index) {
Node newNode = new Node(element);
Node temp = getNode(index);
if (temp != null) {
if (index == 0) {
first = newNode;
newNode.next = temp;
temp.previous = newNode;
} else if (index == size) {
last = newNode;
temp.next = last;
last.previous = temp;
} else {
temp.previous.next = newNode;
newNode.previous = temp.previous;
newNode.next = temp;
temp.previous = newNode;
}
size++;
}
}
查询
public E get(int index) {
checkRange(index);
Node temp = getNode(index);
return temp != null ? (E) temp.element : null;
}
删除
public void remove(int index) {
checkRange(index);
Node temp = getNode(index);
if (temp != null) {
if (index == 0) {
first = temp.next;
} else if (index == size - 1) {
last = temp.previous;
} else {
temp.previous.next = temp.next;
temp.next.previous = temp.previous;
}
size--;
}
}