1. 程式人生 > >java 陣列與連結串列的巢狀使用(陣列連結串列--資料結構)

java 陣列與連結串列的巢狀使用(陣列連結串列--資料結構)

用處:連結串列陣列一般用於在不借用資料庫的情況下,對於大量資料的臨時儲存,來實現快速查詢的功能。

巢狀實現思想:上一篇中已經講了連結串列的建立和操作,借用上一篇中的部分來進行說明。上一篇中的類LinkList 是連結串列類,類中有對連結串列的各種操作,要把連結串列和陣列聯絡起來,就要定義一個連結串列型別的陣列:LinkList  arr [ ] ,我們要把陣列中的每個元素都對映為一個連結串列,通過計算可以得出:

  例如:

假設要存入10000個數,我們定義連結串列陣列的長度為100,在我們向連結串列中每存入一個數的時候,先讓這個數對100取餘;10000個數對100取餘的結果是0-99,那麼我們把得到的0-99作為LinkList arr[ ] 

的索引,結果我們就會得到一個連結串列陣列 LinkList arr [0-99 ],這樣操作就算是把LinkList的陣列大小得到了(通過計算對映到LinkList陣列中的);接下來我們

把相應的值放入到LinkList arr[] 連結串列陣列中的連結串列中,還是按照上面的計算把需要放入的數值和100進行求餘:

例如:int  a = 155;

 Int  b = a%100;  // b = 55

那麼就把數值 存放到 arr[  b  ] 

10000個數存放到LinkList arr 中 被分成了100組,第一組是 一個數與100取餘 餘數全為 的數 都被存放到了 arr[ 0 ] 的連結串列中,第二組是 一個數與

100取餘 餘數全為 的數 都被存放到了 arr[ 1 ] 的連結串列中........第十組是 一個數與100取餘 餘數全為 的數 都被存放到了 arr[ 9 ] 的連結串列中。這樣就分類的把10000個數存放到了陣列連結串列LinkList arr中。

那麼當我們查詢這10000的任意一個數 int  ran 的時候。就可以用int  posit = ran%100; 這個時候我們就可以知道 ran 被儲存在陣列連結串列arr[ posit ] 中,我們遍歷查詢的時候僅僅遍歷連結串列 arr[ posit ] 就可以得到這個數ran 了。

如果使用for迴圈查詢ran 的話,如果ran 10000中的最後一個位置上 就需要遍歷查詢

10000次;相比而言,使用連結串列陣列最多遍歷100次就夠了,這樣就把查詢次數相比for迴圈縮小了100倍,從而達到快速查詢的目的,歐耶 終於寫完了 下面貼程式碼(程式碼中的每個元素是物件) 嘎嘎~~

public class A {
	public int length;
	public int index;
	public LinkList arr[];
	public A(int length){
		this.length=length;
		arr=new LinkList[length];
	}
	public A(){
		this.length=1000;
		arr=new LinkList[length];		
	}
	public LinkList Hash(int a){	//應用到學生類中,對應 a 的為學生的ID
		int index=a%length;		//計算得到連結串列陣列的索引
		if(arr[index]==null){
			LinkList lk1 = new LinkList();
			arr[index]=lk1;
			return arr[index];	//返回找到的連結串列陣列中的一個連結串列
		}
		return arr[index];
	}
	/*
	 * 
	 * 下面這些方法都是對陣列中的連結串列進行操作
	 */
	public void addHeadNode(NodeData data){	//傳過來一個學生物件data 
		int key=data.getKey();	//通過一個方法 獲取到學生的ID, key為得到的學生ID
		LinkList lk=Hash(key);
		lk.addHeadNode(data);	//程式走到這裡的時候會呼叫LinkList 類中的 新增節點操作
	}
	public void addTailNode(NodeData data){	
		int key=data.getKey();
		LinkList lk=Hash(key);
		lk.addTailNode(data);	//程式走到這裡的時候會呼叫LinkList 類中的 新增節點操作
	}
	public void delNode(NodeData data){
		int key=data.getKey();
		LinkList lk=Hash(key);
		lk.delNode(data);		//程式走到這裡的時候會呼叫LinkList 類中的 刪除節點操作
	}
	public void findNode(NodeData data){
		int key = data.getKey();
		LinkList lk=Hash(key);
		lk.findNode(data);		//程式走到這裡的時候會呼叫LinkList 類中的 查詢節點操作
	}
	public void updNode(NodeData data){
		int key = data.getKey();
		LinkList lk = Hash(key);
		lk.updNode(data);		//程式走到這裡的時候會呼叫LinkList 類中的 更新節點操作
	}
}

總結一下 歸根結底到最後還是對具體的連結串列進行的操作,只不過是把連結串列通過一定的規則放到了陣列中,提高了查詢的效率~~~奮鬥得意~