class DoubleLinkedList {
public class Node {
Object value;
Node prev = this;
Node next = this;
public Node(Object v) {
value = v;
}
public String toSting() {
return value.toString();
}
}
private Node head = new Node(null);// 頭節點
private int size; // 鏈大小
private Node getNode(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Node node = head.next;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
private void addBefore(Node newNode, Node node) {
newNode.prev = node.prev;
newNode.next = node;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}
private void addAfter(Node newNode, Node node) {
newNode.prev = node;
newNode.next = node.next;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}
private void removeNode(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
node.prev = null;
node.next = null;
size--;
}
public boolean addFirst(Object o) {
addAfter(new Node(o), head);
return true;
}
public boolean addLast(Object o) {
addBefore(new Node(o), head);
return true;
}
public boolean add(int index, Object o) {
addBefore(new Node(o), getNode(index));
return true;
}
public Object get(int index) {
return getNode(index).value;
}
public boolean remove(int index) {
removeNode(getNode(index));
return true;
}
public boolean removeFirst() {
removeNode(head.next);
return true;
}
public boolean removeLast() {
removeNode(head.prev);
return true;
}
public String toString() {
StringBuffer s = new StringBuffer();
Node node = head;
for (int i = 0; i < size; i++) {
node = node.next;
s.append(",").append(node.value);
}
s.append("]");
return "[" + s.substring(1);
}
}
public class TestDoubleLinkedList {
public static void main(String[] args) {
DoubleLinkedList dll = new DoubleLinkedList();
// 添加
dll.addLast("1");
dll.addLast("2");
dll.addLast("3");
dll.addLast("4");
System.out.println(dll);
dll.addFirst("5");
System.out.println(dll);
dll.addLast("6");
System.out.println(dll);
//移除
dll.removeFirst();
System.out.println(dll);
dll.removeLast();
System.out.println(dll);
dll.remove(2);
System.out.println(dll);
System.out.println(dll.get(1));
}
}