public class DoubleLinkedListZH < E > {
public static final int ELEMENT_NOT_FOUND = - 1 ;
private int size;
private DoubleLinkedListZH. Node < E > headNode;
private DoubleLinkedListZH. Node < E > lastNode;
private static class Node < E > {
E element;
DoubleLinkedListZH. Node < E > next = null ;
DoubleLinkedListZH. Node < E > prev = null ;
public Node ( DoubleLinkedListZH. Node < E > prev , E element, DoubleLinkedListZH. Node < E > next) {
this . element = element;
this . prev = prev;
this . next = next;
}
public Node ( ) {
}
@Override
public String toString ( ) {
StringBuilder sb = new StringBuilder ( ) ;
if ( prev!= null ) {
sb. append ( prev. element) ;
} else {
sb. append ( "null" ) ;
}
sb. append ( "<-" ) . append ( element) . append ( "->" ) ;
if ( next!= null ) {
sb. append ( next. element) ;
} else {
sb. append ( "null" ) ;
}
return sb. toString ( ) ;
}
}
public void clear ( ) {
headNode = null ;
lastNode = null ;
size = 0 ;
}
public void isEmptyPrint ( ) {
if ( headNode == null ) {
System . out. println ( "Empty" ) ;
} else {
System . out. println ( "Not Empty" ) ;
}
}
public void containsPrint ( E element) {
DoubleLinkedListZH. Node < E > node = headNode;
for ( int i = 0 ; i < size ; i++ ) {
if ( node. element == element) {
System . out. println ( "Contain" ) ;
return ;
}
node = node. next;
}
System . out. println ( "Not Contain" ) ;
}
public void add ( int index , E element) {
DoubleLinkedListZH. Node < E > node = new Node < > ( ) ;
node. element = element;
if ( size == 0 ) {
headNode = node;
lastNode = node;
} else if ( index == 0 ) {
node. next = headNode;
headNode. prev = node;
headNode = node;
node. prev = null ;
} else if ( index == size) {
node. prev = lastNode;
lastNode. next = node;
lastNode = node;
node. next = null ;
} else {
DoubleLinkedListZH. Node cur = indexSearchNode ( index) ;
node. next = cur;
node. prev = cur. prev;
cur. prev. next = node;
cur. prev = node;
}
size++ ;
}
public void remove ( int index) {
DoubleLinkedListZH. Node < E > node = indexSearchNode ( index) ;
if ( node. prev == null ) {
headNode = node. next;
node. next. prev = null ;
}
if ( node. next == null ) {
node. prev. next = null ;
lastNode = node. prev;
} else {
node. prev. next = node. next;
node. next. prev = node. prev;
}
size-- ;
}
public void add ( E element) {
add ( size, element) ;
}
private DoubleLinkedListZH. Node < E > indexSearchNode ( int index) {
DoubleLinkedListZH. Node node = new Node ( ) ;
if ( index <= size / 2 ) {
node = headNode;
for ( int i = 0 ; i< index; i++ ) {
node = node. next;
}
} else {
node = lastNode;
for ( int i = size - 1 ; i > index ; i-- ) {
node = node. prev;
}
}
return node;
}
public String toString ( ) {
StringBuilder string = new StringBuilder ( ) ;
string. append ( "size=" ) . append ( size) . append ( " [" ) ;
DoubleLinkedListZH. Node < E > node = headNode;
for ( int i = 0 ; i < size; i++ ) {
if ( i != 0 ) {
string. append ( ", " ) ;
}
string. append ( node) ;
node = node. next;
}
string. append ( "]" ) ;
return string. toString ( ) ;
}
}