java 陣列與連結串列的巢狀使用(陣列連結串列--資料結構)
用處:連結串列陣列一般用於在不借用資料庫的情況下,對於大量資料的臨時儲存,來實現快速查詢的功能。
巢狀實現思想:上一篇中已經講了連結串列的建立和操作,借用上一篇中的部分來進行說明。上一篇中的類LinkList 是連結串列類,類中有對連結串列的各種操作,要把連結串列和陣列聯絡起來,就要定義一個連結串列型別的陣列:LinkList arr [ ] ,我們要把陣列中的每個元素都對映為一個連結串列,通過計算可以得出:
例如:
假設要存入10000個數,我們定義連結串列陣列的長度為100,在我們向連結串列中每存入一個數的時候,先讓這個數對100取餘;10000個數對100取餘的結果是0-99,那麼我們把得到的0-99作為LinkList arr[ ]
把相應的值放入到LinkList arr[] 連結串列陣列中的連結串列中,還是按照上面的計算把需要放入的數值和100進行求餘:
例如:int a = 155;
Int b = a%100; // b = 55
那麼就把數值 a 存放到 arr[ b ] 中
把10000個數存放到LinkList arr 中 被分成了100組,第一組是 一個數與100取餘 餘數全為 0 的數 都被存放到了 arr[ 0 ] 的連結串列中,第二組是 一個數與
那麼當我們查詢這10000的任意一個數 int ran 的時候。就可以用int posit = ran%100; 這個時候我們就可以知道 ran 被儲存在陣列連結串列arr[ posit ] 中,我們遍歷查詢的時候僅僅遍歷連結串列 arr[ posit ] 就可以得到這個數ran 了。
如果使用for迴圈查詢ran 的話,如果ran 在10000中的最後一個位置上 就需要遍歷查詢
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 類中的 更新節點操作
}
}
總結一下 歸根結底到最後還是對具體的連結串列進行的操作,只不過是把連結串列通過一定的規則放到了陣列中,提高了查詢的效率~~~~