class DoublyLinkedList< T> {
private static class Node< T> {
private T element;
private Node< T> prev;
private Node< T> next;
private Node( T element, Node< T> prev, Node< T> next) {
this .element = element;
this .prev = prev;
this .next = next;
}
}
private Node< T> head;
private Node< T> tail;
private int listSize;
public DoublyLinkedList( ) {
head = new Node< T> ( null , null , null ) ;
tail = new Node< T> ( null , head, null ) ;
head.next = tail;
}
public void addFirst( T element) {
addBetween( element, head, head.next ) ;
}
public void addLast( T element) {
addBetween( element, tail.prev , tail) ;
}
public void addBetween( T element, Node< T> nodeBefore, Node< T> nodeAfter) {
Node< T> newNode = new Node< T> ( element, nodeBefore, nodeAfter) ;
nodeBefore.next = newNode;
nodeAfter.prev = newNode;
listSize++;
}
public void reverse( ) {
Node< T> current = head.next ;
Node< T> temp = null ;
tail = head;
while ( current != null ) {
temp = current.prev ;
current.prev = current.next ;
current.next = temp;
current = current.prev ;
}
head = temp.prev ;
}
public static void main
( String [ ] args
) {
DoublyLinkedList< Integer> DLL = new DoublyLinkedList< Integer> ( ) ;
DLL.addFirst ( 5 ) ;
DLL.addLast ( 6 ) ;
DLL.reverse ( ) ;
DLL.addFirst ( 7 ) ;
DLL.addFirst ( 8 ) ;
DLL.addFirst ( 9 ) ;
DLL.addFirst ( 10 ) ;
System .
out .
println ( "This works." ) ; DLL.addLast ( 0 ) ;
System .
out .
println ( "This doesn't." ) ;
}
}
Y2xhc3MgRG91Ymx5TGlua2VkTGlzdDxUPiB7Cglwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlPFQ+IHsKCgkJcHJpdmF0ZSBUIGVsZW1lbnQ7CgkJcHJpdmF0ZSBOb2RlPFQ+IHByZXY7IAoJCXByaXZhdGUgTm9kZTxUPiBuZXh0OwoJCQoJCXByaXZhdGUgTm9kZShUIGVsZW1lbnQsIE5vZGU8VD4gcHJldiwgTm9kZTxUPiBuZXh0KSB7CgkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CgkJCXRoaXMucHJldiA9IHByZXY7CgkJCXRoaXMubmV4dCA9IG5leHQ7CgkJfQoJfQoKCXByaXZhdGUgTm9kZTxUPiBoZWFkOwoJcHJpdmF0ZSBOb2RlPFQ+IHRhaWw7Cglwcml2YXRlIGludCBsaXN0U2l6ZTsKCglwdWJsaWMgRG91Ymx5TGlua2VkTGlzdCgpIHsKCQloZWFkID0gbmV3IE5vZGU8VD4obnVsbCwgbnVsbCwgbnVsbCk7IAoJCXRhaWwgPSBuZXcgTm9kZTxUPihudWxsLCBoZWFkLCBudWxsKTsgCgkJaGVhZC5uZXh0ID0gdGFpbDsKCX0KCQoJcHVibGljIHZvaWQgYWRkRmlyc3QoVCBlbGVtZW50KSB7CgkJYWRkQmV0d2VlbihlbGVtZW50LCBoZWFkLCBoZWFkLm5leHQpOyAKCX0KCQoJcHVibGljIHZvaWQgYWRkTGFzdChUIGVsZW1lbnQpIHsKCQlhZGRCZXR3ZWVuKGVsZW1lbnQsIHRhaWwucHJldiwgdGFpbCk7IAoJfQoJCglwdWJsaWMgdm9pZCBhZGRCZXR3ZWVuKFQgZWxlbWVudCwgTm9kZTxUPiBub2RlQmVmb3JlLCBOb2RlPFQ+IG5vZGVBZnRlcikgewoJCQoJCU5vZGU8VD4gbmV3Tm9kZSA9IG5ldyBOb2RlPFQ+KGVsZW1lbnQsIG5vZGVCZWZvcmUsIG5vZGVBZnRlcik7IAoJCQoJCW5vZGVCZWZvcmUubmV4dCA9IG5ld05vZGU7CgkJbm9kZUFmdGVyLnByZXYgPSBuZXdOb2RlOyAKCQkKCQlsaXN0U2l6ZSsrOwoJfQoJCglwdWJsaWMgdm9pZCByZXZlcnNlKCkgewoJCU5vZGU8VD4gY3VycmVudCA9IGhlYWQubmV4dDsgCgkJTm9kZTxUPiB0ZW1wID0gbnVsbDsKCQkKCQl0YWlsID0gaGVhZDsgCgkJCgkJd2hpbGUoY3VycmVudCAhPSBudWxsKSB7IAoJCQkKCQkJdGVtcCA9IGN1cnJlbnQucHJldjsgCgkJCQoJCQljdXJyZW50LnByZXYgPSBjdXJyZW50Lm5leHQ7IAoJCQkKCQkJY3VycmVudC5uZXh0ID0gdGVtcDsgCgkJCQoJCQljdXJyZW50ID0gY3VycmVudC5wcmV2OyAKCQl9CgkJCgkJaGVhZCA9IHRlbXAucHJldjsgCgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCgkJRG91Ymx5TGlua2VkTGlzdDxJbnRlZ2VyPiBETEwgPSBuZXcgRG91Ymx5TGlua2VkTGlzdDxJbnRlZ2VyPigpOwoJCURMTC5hZGRGaXJzdCg1KTsKCQlETEwuYWRkTGFzdCg2KTsKCQkKCQlETEwucmV2ZXJzZSgpOwoJCQoJCURMTC5hZGRGaXJzdCg3KTsKCQlETEwuYWRkRmlyc3QoOCk7CgkJRExMLmFkZEZpcnN0KDkpOwoJCURMTC5hZGRGaXJzdCgxMCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJUaGlzIHdvcmtzLiIpOwoJCURMTC5hZGRMYXN0KDApOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhpcyBkb2Vzbid0LiIpOwoJCQoJfQoJCn0K