数组实现列表

先写一个接口,定义了列表的增删查改的方法

public interface MyList {
	void delete(int index); //根据索引值删除元素
	void delete(Object element);  //删除某个元素
	void add(Object element);     //添加一个元素
	void update(int index,Object newElement);    //修改某一个索引位置的值
	boolean contains(Object target);  //是否包含目标元素
	Object at(int index);     //获取目标索引位置的元素
	int indexOf(Object element);   //获取目标元素的索引

}

接口方法实现
使用数组实现List

public class SingleLinkList implements MyList{
	private NodeList head; //头节点
	private NodeList last;
	int size;

	public void delete(int index) {
		if(index<0||index>=size) return;   //处理边界
		int i=0;         //节点的索引
		NodeList p=head;
		NodeList pre=null;
		while(p!=null){
			if(i==index){
				if(p==head){      //如果删除的是头节点
					head=head.next;   //头节点后移
				}else {
					pre.next=p.next;
				}
				size--;
				break;
			}
			pre=p;         //前驱指针后移
			p=p.next;     //p指针后移
			i++;
		}

	}

	public void delete(Object element) {
		NodeList p=head;    //头本身不能动
		NodeList pre=null;  //p节点的前一个节点    相当于p的前驱   因为是单链表   要实现删除的话   必须要2个指针挨着移动才可以
		while(p!=null){
			if(p.object.equals(element)){
				if(p==head){     //如果删除的是头部节点
					head=head.next;       //将头部节点后移
				}else {
					pre.next=p.next;
				}
				size--;
				break;    //删除元素后  没必要再继续移动了
			}
			pre=p;        //前驱指针后移
			p=p.next;     //p指针后移
		}

	}

	public void add(Object element) {
		if(head==null){                   //链表为空
			head=new NodeList(element);
			last=head;          //头节点   尾节点都是这个节点
		}else {
			last.next=new NodeList(element);
			last=last.next;   //尾指针后移
		}
		size++;          //链表的大小+1

	}

	public void update(int index, Object newElement) {
		if(index<0||index>=size) return; //处理边界
		int i=0;         //节点的索引
		NodeList p=head;
		while(p!=null){
			if(i==index){
				p.object=newElement;
				break;
			}
			p=p.next;     //p指针后移
			i++;
		}
	}

	public boolean contains(Object target) {
		NodeList p=head;
		while(p!=null){
			if(p.object.equals(target)){
				return true;
			}
			p=p.next;     //p指针后移
		}
		return false;
	}

	public Object at(int index) {
		if(index<0||index>=size) return null; //处理边界
		int i=0;         //节点的索引
		NodeList p=head;
		while(p!=null){
			if(i==index){
				return p.object;
			}
			p=p.next;     //p指针后移
			i++;
		}
		return null;
	}

	public int indexOf(Object element) {
		int i=0;         //节点的索引
		NodeList p=head;
		while(p!=null){
			if(p.object.equals(element)){
				return i;
			}
			p=p.next;     //p指针后移
			i++;
		}
		return -1;
	}





	@Override
	public String toString() {
		NodeList p=head;    //不要随便去动原来的饿头节点  因此复制一份
		StringBuilder sb=new StringBuilder("[");
		while(p!=null){
			sb.append(p.object);
			p=p.next;
			if(p!=null){
				sb.append(",");
			}
		}
		sb.append("]");
		return sb.toString();
	}
}

测试,每一个方法都亲测,完全正确