数据结构之静态链表

package org.list.cn;

/***
 * 静态链表
 * 数组的元素有两个数据域(data cursor)data用来存放数据,cursor用来表示后继在数组中的下标
 * 静态链表分为两部分(已经使用的空间单元和未使用的空闲单元),,删除操作就是把数据放置在空闲单元,cursor不指向这个数据
 * @author zzg
 *
 */
public class StaticList {

	private Element[] link=null;  //保存数据的数组
	private int current=0;  //下一个可用空闲容器的下标
	private int head=0;     //静态链表头的下标
	private int length=0; // 当前链表的长度
	private int maxSize=0;  //链表的最大长度
	class Element{
		Object data;  //存入的数据
		int cursor;   //下一个数据的下标
	}
	public StaticList(int size) {
		// 初始化静态链表
		link=new Element[size];
		for(int i=0;i<size;i++){
			link[i]=new Element();
			link[i].data=-1;
			link[i].cursor=i+1;
		}
		current=0;
		head=0;
		length=0;
		maxSize=size;
	}
	public int add(Object obj){
		if(length<maxSize){
			link[current].data=obj;
			current=link[current].cursor;
			length++;
			return 0;  //成功添加数据
		}else{
			return -1;   //添加数据失败
		}
	}
	/**
	 * 从指定位置插入数据
	 * @param obj  准备插入的数据
	 * @param pos  准备插入的位置
	 * @return
	 */
	public int insert(Object obj,int pos){
		if(length<maxSize && link!=null && pos<length &&pos>=0){
			int iCurrent=current;
			current=link[current].cursor;   //将currnet指向下一个空闲位置
			if(pos==0){    //插入的位置在最前面
				link[iCurrent].data=obj;
				link[iCurrent].cursor=head;
				head=iCurrent;
			}else if(pos==length-1){   //插入的位置在链表的末端
				link[iCurrent].data=obj;   //直接放入数据
			}else{    //插入的位置的前后都存在数据单元
				int preIndex=getTrulyIndex(pos-1);
				link[iCurrent].cursor=link[preIndex].cursor;
				link[iCurrent].data=obj;
				link[preIndex].cursor=iCurrent;
			}
			length++;
			return 0;
		}
		return -1;
	}
	public int delete(){   //删除当前链表的最后一个数据
		if(length>0 && link!=null){
			int temp=current;
			current=getTrulyIndex(length-1);
			link[current].cursor=temp;//只是将数据的下标执行空闲单元
			length--;     //将数据的长度-1
			return 0;
		}
		return -1;
	}
	/***
	 * 删除指定位置的元素
	 * @param pos
	 * @return
	 */
	public int delete(int pos){
		if(length<maxSize && link!=null && pos<length &&pos>=0){
			if(pos==0){
				int iHead=head;
				head=link[head].cursor;
				link[iHead].cursor=current;
				current=iHead;
			}else if(pos==(length-1)){
				int last=getTrulyIndex(pos);
				if(last!=-1){
					link[last].cursor=current;
					current=last;
				}
			}else{
				int preIndex=getTrulyIndex(pos-1);
				int temp=current;
				current=link[preIndex].cursor;
				link[preIndex].cursor=link[current].cursor;
				link[current].cursor=temp;
			}
			length--;
			return 0;
		}
		return -1;
	}
	/***
	 * 获取给定位置的下标
	 * @param position  给定的位置
	 * @return
	 */
	public int getTrulyIndex(int position){
		int i=0;
		int iHead=head;
		if(link!=null){
			while(i<position){    //循环到给定的位置,然后获取下标
 				iHead=link[iHead].cursor;
				i++;
			}
			if(i==position){
				return iHead;
			}
		}
		return -1;//获取失败
	}
}

你可能感兴趣的:(数据结构之静态链表)