带虚拟头结点的单链表
public class DummyLinkedList < E> {
private int size;
private Node< E> first;
private static int ELEMENT_NOT_FOUND= - 1 ;
private static class Node < E> {
Object element;
Node< E> next;
public Node ( E element, Node< E> next) {
super ( ) ;
this . element = element;
this . next = next;
}
}
public DummyLinkedList ( ) {
first= new Node < E> ( null, null) ;
}
public void clear ( ) {
size= 0 ;
first= null;
}
public int size ( ) {
return size;
}
public int indexOf ( E element) {
if ( element== null) {
for ( int i= 0 ; i< size; i++ ) {
if ( node ( i) . element== null) {
return i;
}
}
} else {
for ( int i= 0 ; i< size; i++ ) {
if ( node ( i) . element. equals ( element) ) {
return i;
}
}
}
return ELEMENT_NOT_FOUND;
}
@Override
public String toString ( ) {
StringBuilder sb= new StringBuilder ( ) ;
Node< E> node= first. next;
sb. append ( "[" ) ;
for ( int i= 0 ; i< size; i++ ) {
sb. append ( node ( i) . element) ;
if ( i!= size- 1 ) {
sb. append ( "," ) ;
}
}
sb. append ( "]" ) ;
return sb. toString ( ) ;
}
public boolean isEmpty ( ) {
return size== 0 ;
}
public boolean contains ( Object element) {
for ( int i= 0 ; i< size; i++ ) {
if ( element== null) {
if ( node ( i) . element== null) {
return true ;
}
} else {
if ( node ( i) . element. equals ( element) ) {
return true ;
}
}
}
return false ;
}
public void add ( Object element) {
add ( size, element) ;
}
public Object get ( int index) {
return node ( index) . element;
}
public Object set ( int index, Object element) {
Node< E> temp= node ( index) ;
E e= ( E) temp. element;
temp. element= element;
return e;
}
public void add ( int index, Object element) {
rangeCheckForAdd ( index) ;
Node< E> prev= index== 0 ? first: node ( index- 1 ) ;
Node< E> temp= new Node ( element, prev. next) ;
prev. next= temp;
size++ ;
}
public E remove ( int index) {
Node< E> temp= null;
Node< E> prev= index== 0 ? first: node ( index- 1 ) ;
temp= prev. next;
prev. next= prev. next. next;
size-- ;
return ( E) temp. element;
}
private Node node ( int index) {
rangeCheck ( index) ;
Node temp= first. next;
for ( int i= 0 ; i< index; i++ ) {
temp= temp. next;
}
return temp;
}
private void outBounds ( int index) {
throw new IndexOutOfBoundsException ( "Index:" + index+ ",Size: " + size) ;
}
private void rangeCheck ( int index) {
if ( index< 0 || index>= size) {
outBounds ( index) ;
}
}
private void rangeCheckForAdd ( int index) {
if ( index< 0 || index> size) {
outBounds ( index) ;
}
}
}