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];
}
}
}