双链表的操作
package shuanglianbiao ;
public class Doublelink < E > {
public Node < E > first;
private Node < E > last;
private int size;
private class Node < E > {
private Node < E > prev;
private E item;
private Node < E > next;
public Node ( ) {
}
public Node ( Node < E > prev, E item, Node < E > next) {
this . prev = prev;
this . item = item;
this . next = next;
}
}
private void linkFirst ( E e) {
Node < E > f = first;
Node < E > newNode = new Node < E > ( null , e, f) ;
first = newNode;
if ( f== null ) {
last = newNode;
} else {
f. prev = newNode;
newNode. next = f;
}
size++ ;
}
private void linkLast ( E e) {
Node < E > l = last;
Node < E > newNode = new Node < E > ( l, e, null ) ;
last = newNode;
if ( l== null ) {
first = newNode;
} else {
l. next = newNode;
newNode. prev = l;
}
size++ ;
}
public void addFirst ( E e) {
linkFirst ( e) ;
}
public void addLast ( E e) {
linkLast ( e) ;
}
public void print ( Node < E > e) {
if ( e!= null ) {
System . out. print ( e. item+ "-----" ) ;
if ( e. next!= null ) {
this . print ( e. next) ;
}
}
}
public void checkElement ( int index) {
if ( index< 0 || index>= size) {
throw new IndexOutOfBoundsException ( "index:" + index+ ",size:" + size) ;
}
}
private Node < E > node ( int index) {
if ( index<= ( size/ 2 ) ) {
Node < E > f = first;
for ( int i = 0 ; i< index; i++ ) {
f = f. next;
}
return f;
}
if ( index> ( size/ 2 ) ) {
Node < E > n = last;
for ( int j = size- 1 ; j> index; j++ ) {
n = n. prev;
}
return n;
}
return null ;
}
private void setNode ( int index, E data) {
checkElement ( index) ;
Node < E > preNode = node ( index) ;
preNode. item = data;
}
private void addNode ( int index, E data) {
Node < E > node = node ( index) ;
Node < E > nodePre = node. prev;
Node < E > nodeNext = node. next;
Node < E > newNode = new Node < > ( nodePre, data, node) ;
nodePre. next= newNode;
node. prev= newNode;
newNode. prev = nodePre;
newNode. next = node;
}
public void add ( int index, E data) {
checkElement ( index) ;
if ( index== 0 ) linkFirst ( data) ;
else if ( index== ( size- 1 ) ) linkLast ( data) ;
else {
addNode ( index, data) ;
size++ ;
}
}
public void set ( int index, E data) {
setNode ( index, data) ;
}
public E get ( int index) {
checkElement ( index) ;
return node ( index) . item;
}
private E unlink ( Node < E > x) {
E element = x. item;
Node < E > prev = x. prev;
Node < E > next = x. next;
if ( prev== null ) {
first = next;
next. prev = null ;
} else {
prev. next = next;
x. prev = null ;
}
if ( next== null ) {
last = prev;
prev. next = null ;
} else {
next. prev = prev;
x. next = null ;
}
x. item = null ;
size-- ;
return element;
}
public E remove ( int index) {
checkElement ( index) ;
return unlink ( node ( index) ) ;
}
public boolean remove ( Object o) {
if ( o== null ) {
for ( Node < E > x = first; x!= null ; x= x. next) {
if ( x. item== null ) {
unlink ( x) ;
return true ;
}
}
} else {
for ( Node < E > x = first; x!= null ; x= x. next) {
if ( x. item. equals ( o) ) {
unlink ( x) ;
return true ;
}
}
}
return false ;
}
public int size ( ) {
return size;
}
}
package shuanglianbiao ;
public class Test3 {
public static void main ( String [ ] args) {
Doublelink < String > link = new Doublelink ( ) ;
link. addLast ( "C语言" ) ;
link. addLast ( "C++" ) ;
link. addLast ( "Python" ) ;
link. addFirst ( "Java" ) ;
link. print ( link. first) ;
System . out. println ( ) ;
link. add ( 0 , "PHP" ) ;
link. print ( link. first) ;
System . out. println ( link. size ( ) ) ;
}
}