package com.uncle.linkedbox.src.test;
import com.uncle.linkedbox.src.util.ArrayBox;
import com.uncle.linkedbox.src.util.LinkedBox;
public class TestMain {
public static void main(String[] args){
ArrayBox ab = new ArrayBox();
ab.add(10);
ab.remove(0);
ab.get(0);
ab.size();
LinkedBox lb = new LinkedBox();
lb.add(10);
lb.remove(0);
lb.get(0);
lb.size();
}
}
package com.uncle.linkedbox.src.util;
public interface Box {
public boolean add(int element);
public int get(int index);
public int remove(int index);
public int size();
}
package com.uncle.linkedbox.src.util;
public class BoxIndexOutOfBoundsException extends RuntimeException{
public BoxIndexOutOfBoundsException(){}
public BoxIndexOutOfBoundsException(String msg){
super(msg);
}
}
package com.uncle.linkedbox.src.util;
public class ArrayBox implements Box{
private static final int DEFAULT_CAPACITY = 10;
private int[] elementDate;
private int size = 0;
public ArrayBox(){
elementDate = new int[DEFAULT_CAPACITY];
}
public ArrayBox(int capacity){
elementDate = new int[capacity];
}
private void ensureCapacityInternal(int minCapacity){
if(minCapacity - elementDate.length > 0){
this.grow(minCapacity);
}
}
private void grow(int minCapacity){
int oldCapacity = elementDate.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if(newCapacity - minCapacity < 0){
newCapacity = minCapacity;
}
elementDate = this.copyOf(elementDate,newCapacity);
}
private int[] copyOf(int[] oldArray,int newCapacity){
int[] newArray = new int[newCapacity];
for(int i=0;i<oldArray.length;i++){
newArray[i] = oldArray[i];
}
return newArray;
}
private void rangeCheck(int index){
if(index<0 || index>=size){
throw new BoxIndexOutOfBoundsException("Index:"+index+",Size:"+size);
}
}
public boolean add(int element){
this.ensureCapacityInternal(size+1);
elementDate[size++] = element;
return true;
}
public int get(int index){
this.rangeCheck(index);
return elementDate[index];
}
public int remove(int index){
this.rangeCheck(index);
int oldValue = elementDate[index];
for(int i=index;i<size-1;i++){
elementDate[i] = elementDate[i+1];
}
elementDate[--size] = 0;
return oldValue;
}
public int size(){
return size;
}
}
package com.uncle.linkedbox.src.util;
public class LinkedBox implements Box{
private Node first;
private Node last;
private int size;
private void linkLast(int element){
Node l = last;
Node newNode = new Node(l,element,null);
last = newNode;
if(l==null){
first = newNode;
}else{
l.next = newNode;
}
size++;
}
private void rangeCheck(int index){
if(index<0 || index>=size){
throw new BoxIndexOutOfBoundsException("Index:"+index+",Size:"+size);
}
}
private Node node(int index){
Node targetNode;
if(index < (size>>1)){
targetNode = first;
for(int i=0;i<index;i++){
targetNode = targetNode.next;
}
}else{
targetNode = last;
for(int i=size-1;i>index;i--){
targetNode = targetNode.prev;
}
}
return targetNode;
}
private int unlink(Node targetNode){
int oldValue = targetNode.item;
Node prev = targetNode.prev;
Node next = targetNode.next;
if(prev==null){
first = next;
}else{
prev.next = next;
targetNode.prev = null;
}
if(next==null){
last = prev;
}else{
next.prev = prev;
targetNode.next = null;
}
size--;
return oldValue;
}
public boolean add(int element) {
this.linkLast(element);
return true;
}
public int get(int index) {
this.rangeCheck(index);
Node targetNode = this.node(index);
return targetNode.item;
}
public int remove(int index) {
this.rangeCheck(index);
Node targetNode = this.node(index);
int oldValue = this.unlink(targetNode);
return oldValue;
}
public int size() {
return size;
}
}
package com.uncle.linkedbox.src.util;
public class Node {
public Node prev;
public int item;
public Node next;
public Node(Node prev,int item,Node next){
this.prev = prev;
this.item = item;
this.next = next;
}
}
- 链表结构