java实现线性表

/**

 * 线性表

 * @author zyyt

 *

 */

public  class LinkList {//框架级别的大师级

 

private int size;//链表的实际大小

 

private Object[] elementData ;//存储元素的数组

 

private final static int DEFAULT_SIZE = 10;//默认链表的容量

 

private final Object[] DEFAULT_EMPTY = {};//空数组

 

public LinkList() throws Exception{//构造方法初始化LinkList

 

this(DEFAULT_SIZE);

 

}

 

public LinkList(int initCapicity) throws Exception{//构造方法初始化LinkList

 

if(initCapicity <0){//initCapicity 如果容量大小小于0 则抛出异常

System.out.println("initCapicity" + "需要大于等于0");

throw new Exception();

}

 

if(0 == initCapicity){//如果initCapicity为0 则把空数组  赋值给elementData

elementData =  DEFAULT_EMPTY;

}else{

elementData = new Object[initCapicity];//初始化elementData

}

 

}

 

//顺序链表中添加数据

public synchronized void add(Object obj){

 

/*

* 判断链表的长度与数组的大小比较,来判断是否需要扩容

*/

if(size == elementData.length ){

 

Object[]  array = new Object[elementData.length * 2 + 1];

     

System.arraycopy(elementData, 0, array, 0, size);

elementData = array;

}

   

elementData[size++] = obj;

 

}

 

//链表中插入数据

    public synchronized void set(int index,Object o){

 

if(elementData.length < size + 1){

 

Object[]  array = new Object[elementData.length * 2 + 1];

     

System.arraycopy(elementData, 0, array, 0, size);

elementData = array;

}

 

for(int i = size - 1 ;i>=index;i--){

 

elementData[i+1] = elementData[i]; 

 

}

 

elementData[index] = o;

 

size++;

}

 

//获取所在索引的元素

    public  Object get(int index) throws Exception{

    

    ensureIndexNotOutOfBounds(index);

    

    return elementData[index];

    

    }

 

    //判断这个线性表是否为空

public boolean isEmpty(){

return size == 0;

}

 

//获取线性表的元素个数

public int size(){

return size;

}

 

//链表删除一个元素

public synchronized void remove(int index) throws Exception{

 

ensureIndexNotOutOfBounds(index);

 

System.arraycopy(elementData, index + 1, elementData, index , size - index - 1);

    size--;

}

 

//确保index的大小  在数组elementData的范围内

private void ensureIndexNotOutOfBounds(int index) throws Exception{

 

    if(index < 0 || index >= size){

    System.out.println(index + "小于0 或者"+index + "大于" + size);

    throw new Exception();

    }

}

 

//查看线性表中是否包含某个元素

public boolean contain(Object o) throws Exception{

 

return indexOf(o) >= 0;

}

 

//线性表中添加一个线性表

public synchronized void add(LinkList list) throws Exception{

 

if(list != null){

for(int i=0;i<list.size;i++){

 

if(this.contain(list.get(i)) == false){

elementData[size++] = list.get(i);

}

}

}

 

}

 

//获取一个元素在链表中第一次出现的位置

public int indexOf(Object o) throws Exception{

 

int result = -1;

 

if (o == null) {

            for (int i = 0; i < size; i++)

                if (elementData[i]==null)

                result = i;

        } else {

          for (int i = 0; i < size; i++)

              if (o.equals(elementData[i]))

              result = i;

        }

        return result;

 

}

 

//删除链表中包含另外一个链表的元素

public synchronized void remove(LinkList list) throws Exception{

 

if(list != null){

for(int i=0;i<list.size;i++){

if(this.contain(list.get(i))){

this.remove(this.indexOf(list.get(i)));

size--;

}

}

}

 

}

 

//获取迭代器

public Iterator iterator(){

return new Iterator();

}

 

//迭代器类

public class Iterator {

 

int cousor = -1;

 

//判断是否还有下一个对象

public boolean hasNext(){

return cousor + 1 < size;

}

 

//获取下一个对象

public Object next(){

return elementData[++cousor];

}

 

}

 

 }

 

posted @ 2016-09-23 16:55  sujianbo  阅读(4017)  评论(0编辑  收藏  举报