1. 程式人生 > >Java實現靜態連結串列

Java實現靜態連結串列

     靜態連結串列其實是為了給沒有指標的高階語言設計的一種實現單鏈表能力的方法。

     靜態連結串列是用陣列描述的連結串列,陣列的元素都是由兩個資料域組成,data和cur。陣列的每個下標都對應一個data和一個cur,資料域data用來存放元素,而cur相當於單鏈表中的next指標,存放該元素的後繼在陣列中的下標,cur即遊標。

     節點類,將data和cur結構化:

/**
	 * 節點類
	 * @param <T>
	 */
	public static class Node<T>{
		private T value;
		private int cur;
		
		public Node(T data, int cur){
			this.value = data;
			this.cur = cur;
		}
	}

完整程式碼(實現初始化,順序新增,插入):
public class StaticLinkedList<T> {
	private Node<T>[] data;
	private static int MAXSIZE = 1000; //初始化相對建立的大一些,以便有空閒空間保證插入時不至於溢位

	public StaticLinkedList(){
		data = new Node[MAXSIZE];
		initList(data); 
	}
	
	public StaticLinkedList(int maxsize){
		data = new Node[maxsize];
		initList(data);
	}
	
	/**
	 * 初始化靜態連結串列
	 * 將一維陣列data中的各分量鏈成一備用連結串列
	 * @param data
	 */
	private void initList(Node<T>[] data) {
		for(int i=0; i<data.length-1;i++){
			data[i] = new Node<T>(null, i+1);	//初始化每個節點的cur值,為其陣列中下標加1,指向下一個元素
		}
		data[data.length-1] = new Node<T>(null, 0);	//陣列最後一個元素的cur,用來存放第一個插入元素的下標,即第一個有值元素的下標
	}
	
	/**
	 * 順序新增元素
	 * @param item 待新增的元素
	 * @return
	 */
	public boolean add(T item){
		int newCur = data[0].cur;	//第一個空閒空間的下標
		int temp = data[newCur].cur;	//儲存第一個空閒空間的遊標
		Node<T> newNode = new Node<T>(item, 0);	//新新增元素,由於是最後一個元素,其遊標置0
		data[newCur] = newNode;
		if(data[0].cur>1){	
			data[newCur-1].cur = newCur;	//如果靜態連結串列不為空,應在新增時將前一元素的遊標和新元素的下標聯絡起來
		}
		data[0].cur = temp;	//新的空閒空間,賦給第一個元素的遊標
		data[data.length-1].cur = 1;	//最後一個元素的遊標存放第一個有值元素的下標,為1
		return true;
	}
	
	/**
	 * 靜態連結串列的插入操作
	 * @param item 待插入的元素
	 * @param index 插入元素的位置
	 * @return
	 */
	public boolean insert(T item, int index){		
		int ccur = data[data.length-1].cur;	//陣列最後一個節點的遊標
		for(int i=0;i<index-1;i++){	//遍歷,獲取index之前一元素
			ccur = data[ccur].cur;
		}
		int nextcur = data[ccur].cur;	//將前一元素的遊標儲存
		data[ccur].cur = data[0].cur;	//將新增加的元素的下標賦給前一元素的遊標
		int newCur = data[0].cur;	
		Node<T> newNode = new Node<T>(item, nextcur); //下標賦值,插入到兩元素之間
		data[newCur] = newNode;	//增加新元素
		data[0].cur++;	//第一個元素的cur加1
		return true;
	}

	@Override
	public String toString() {
		String str = "[ ";
		int ccur = data[data.length-1].cur;
		while(data[ccur].value!=null) {
			str = str + data[ccur].value + " ";
			ccur = data[ccur].cur;
		}
		str = str + "]";
		return str;
	}

	/**
	 * 節點類
	 * @param <T>
	 */
	public static class Node<T>{
		private T value;
		private int cur;
		
		public Node(T data, int cur){
			this.value = data;
			this.cur = cur;
		}
	}
}