java学习札记—自定义实现linkedList集合

java学习笔记—自定义实现linkedList集合
/*
 * 自定义实现linkedList集合结构
 */
public class MyLinkedList {
	private Node firstNode; // 永远指向第一个元素
	private Node lastNode; // 永远指向最后一个元素
	private int size; //集合的长度

	// 添加元素
	public boolean add(Node node) {
		if (null == node) {
			throw new IllegalArgumentException("不允许null的Node元素");
		}
		if (null == firstNode) {
			firstNode = node; // 集合中没有元素,就把该元素赋值给第一个元素
		} else {
			Node lastNode = getLast();
			//双向链表
			lastNode.setNext(node); //指向的下一个元素
			node.setPrev(lastNode); //指向的上一个元素
		}
		lastNode=node; //把新添加的元素赋值给最后一个元素
		size++; //每添加一次长度加1
		return true;
	}
	
	//在列表的首部添加元素
	public void addFirst(Node node){
		if(node == null){
			throw new IllegalArgumentException("不允许null的Node元素");
		}
		if(firstNode == null){
			lastNode=node; 
		}else{
			Node n=getFirst();
			n.setPrev(node);
			node.setNext(n);
		}
		firstNode=node;
		size++;
	}
	
	//在列表的末尾添加元素
	public void addLast(Node node){
		if(node == null){
			throw new IllegalArgumentException("不允许null的Node元素");
		}
		if(lastNode == null){
			firstNode=node; 
		}else{
			Node n=getLast();
			n.setNext(node);
			node.setPrev(n);
		}
		lastNode=node;
		size++;
	}
	
	//删除列表中第一个元素
	public void removeFirst(){
		Node node=firstNode.getNext();
		node.setPrev(null);
		firstNode=node;
		size--;
	}
	
	//删除列表中最后一个元素
	public void removeLast(){
		Node node=lastNode.getPrev();
		node.setNext(null);
		lastNode=node;
		size--;
	}
	
	//删除列表中指定的元素
	public void remove(int index){
		if(index < 0 || index >= size){
			throw new ArrayIndexOutOfBoundsException();
		}
		if (null == firstNode) {
			throw new IllegalStateException("集合中没有元素");
		}
		int i=0;
		Node node=firstNode;
		if(index == 0){
			node=node.getNext();
			node.setPrev(null);
			firstNode=node;
			size--;
			return;
		}
		if(index == (size-1)){
			node=lastNode.getPrev();
			node.setNext(null);
			lastNode=node;
			size--;
			return;
		}
		if(index<size/2){
			while(i!=index){
				node=node.getNext();
				i++;
			}
		}else{
			i=size-1;
			node=lastNode;
			while(i!=index){
				node=node.getPrev();
				i--;
			}
		}
		Node next=node.getNext();
		Node prev=node.getPrev();
		next.setPrev(prev);
		prev.setNext(next);
		size--;
	}
	
	/*
	 * 返回此列表中指定位置处的元素(二分法)
	 */
	public Node get(int index) {
		if(index < 0 || index >= size){
			throw new ArrayIndexOutOfBoundsException();
		}
		if (null == firstNode) {
			throw new IllegalStateException("集合中没有元素");
		}
		int i=0;
		Node node;
		if(index<size/2){
			node=firstNode;
			while(i!=index){
				node=node.getNext();
				i++;
			}
		}else{
			i=size-1;
			node=lastNode;
			while(i!=index){
				node=node.getPrev();
				i--;
			}
		}
		return node;
	}
	/*
	 * 返回此列表中指定位置处的元素(普通方法)
	 */
	public Node myGet(int index) {
		if(index < 0 || index >= size){
			throw new ArrayIndexOutOfBoundsException();
		}
		if (null == firstNode) {
			throw new IllegalStateException("集合中没有元素");
		}
		int i=0;
		Node node=firstNode;
		while(i!=index){
			node=node.getNext();
			i++;
		}
		return node;
	}

	/*
	 * 获取最后一个元素
	 */
	public Node getLast() {
		if (null == firstNode) {
			throw new IllegalStateException("集合中没有元素");
		}
		return lastNode;
	}
	
	/*
	 * 获取最后一个元素
	 */
	public Node getFirst() {
		if (null == firstNode) {
			throw new IllegalStateException("集合中没有元素");
		}
		return firstNode;
	}

	/*
	 * 获取集合长度
	 */
	public int size() {
		return size;
	}
}