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 类中的 更新节点操作
	}
}

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



你可能感兴趣的:(Java,数据结构)