您的位置:首页 > 理论基础 > 数据结构算法

java 数组与链表的嵌套使用(数组链表--数据结构)

2016-06-29 19:18 691 查看
用处:链表数组一般用于在不借用数据库的情况下,对于大量数据的临时存储,来实现快速查找的功能。

嵌套实现思想:上一篇中已经讲了链表的创建和操作,借用上一篇中的部分来进行说明。上一篇中的类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

那么就把数值 a 存放到 arr[  b  ] 中

把10000个数存放到LinkList arr 中 被分成了100组,第一组是 一个数与100取余 余数全为 0 的数 都被存放到了 arr[ 0 ] 的链表中,第二组是 一个数与100取余 余数全为 1 的数 都被存放到了 arr[ 1 ] 的链表中........第十组是 一个数与100取余 余数全为 9 的数 都被存放到了 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 类中的 更新节点操作
}
}

总结一下 归根结底到最后还是对具体的链表进行的操作,只不过是把链表通过一定的规则放到了数组中,提高了查找的效率~~~



~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息