双向链表

package com.kfm.structure;
import java.util.AbstractList;
public class MyDoubleLinked1 extends AbstractList {
private Node first;
private Node last;
private int size;
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean contains(Object o) {
Node c = first;
while (c != null) {
if (c.valueEquals(o)) {
return true;
}
c = c.next;
}
return false;
}
@Override
public Object[] toArray() {
Object[] array = new Object[size];
Node c = first;
int index = 0;
while (c != null) {
array[index] = c.value;
c = c.next;
index++;
}
return array;
}
@Override
public boolean add(Object o) {
Node c = new Node(last, o, null);
if (first == null) {
first = c;
} else {
last.next = c;
}
last = c;
size++;
return true;
}
@Override
public boolean remove(Object o) {
if (first == null){
return false;
}
if (first.valueEquals(o)){
Node old = first;
if (first.next != null){
first.next.prev = null;
}
first = old.next;
old.next = null;
} else {
Node c = first.next;
while (c != null && !c.valueEquals(o)){
c = c.next;
}
if (c != null){
if (last.valueEquals(o)){
last = last.prev;
last.next.prev = null;
last.next = null;
} else {
c.prev.next = c.next;
c.next.prev = c.prev;
c.prev = null;
c.next = null;
}
}
}
size --;
return true;
}
@Override
public void clear() {
first = last = null;
size = 0;
}
@Override
public Object get(int index) {
Node node = getNode(index);
return node.value;
}
private Node getNode(int index){
if (index >= 0 && index < size){
Node point = first;
if (index >= size / 2){
point = last;
for (int i = 0; i < size - index - 1; i++) {
point = point.prev;
}
} else {
for (int i = index -1; i >= 0; i--) {
point = point.next;
}
}
return point;
}
throw new IndexOutOfBoundsException("下标越界: " + index);
}
@Override
public Object set(int index, Object element) {
if (index >= 0 && index < size) {
Node node = getNode(index);
Object old = node.value;
node.value = element;
return old;
}
throw new IndexOutOfBoundsException();
}
@Override
public void add(int index, Object element) {
if (index == size){
add(element);
} else if (index == 0) {
} else {
}
}
@Override
public Object remove(int index) {
Object old = null;
if (index == 0){
if (first == last){
old = first.value;
first = last = null;
} else {
first = first.next;
first.prev.next = null;
old = first.prev.value;
first.prev = null;
}
} else if (index == size - 1) {
last = last.prev;
Node oldLast = last.next;
oldLast.prev = null;
old = oldLast.value;
last.next = null;
} else {
Node node = getNode(index);
node.prev.next = node.next;
node.next.prev = node.prev;
node.next = null;
node.prev = null;
old = node.value;
}
size --;
return old;
}
@Override
public int indexOf(Object o) {
Node c = first;
int index = 0;
while (c != null){
if (c.valueEquals(o)){
return index;
}
c = c.next;
index ++;
}
return -1;
}
@Override
public int lastIndexOf(Object o) {
Node c = last;
int index = size - 1;
while (c != null) {
if (c.valueEquals(o)) {
return index;
}
c = c.prev;
index--;
}
return -1;
}
@Override
public Object[] toArray(Object[] a) {
Object[] array = new Object[size];
Node c = first;
int index = 0;
while (c != null) {
array[index] = c.value;
c = c.next;
index++;
}
return array;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("{");
Node c = first;
while (c != null) {
sb.append(c.value);
if (c.next != null) {
sb.append(", ");
}
c = c.next;
}
sb.append(" }");
return sb.toString();
}
private class Node {
private Node prev;
private Object value;
private Node next;
public Node(Node prev, Object value, Node next) {
this.prev = prev;
this.value = value;
this.next = next;
}
public boolean valueEquals(Object value){
if (this.value == null){
return this.value == value;
} else {
return this.value.equals(value);
}
}
}
}
测试:
import java.util.Arrays;
public class MyDoubleLinkedTest {
public static void main(String[] args) {
MyDoubleLinked1 d = new MyDoubleLinked1();
System.out.println(d.isEmpty());
System.out.println(d.size());
d.add("null");
d.add("a");
d.add("b");
d.add("c");
d.add("d");
d.add("e");
d.add("1");
d.add("2");
System.out.println(d);
System.out.println(d.size());
System.out.println(d.indexOf("b"));
d.remove("d");
System.out.println(d);
System.out.println(d.size());
System.out.println(d.contains("1"));
System.out.println(Arrays.toString(d.toArray()));
System.out.println(d.get(4));
d.set(3,3);
System.out.println(d);
d.add(3,"g");
System.out.println(d);
System.out.println(d.size());
d.remove(3);
System.out.println(d);
System.out.println(d.size());
}
}