队列:简称队,是限制只允许在表的一端插入,在另一端删除的线性表,允许插入的一端称之为队尾(rear),允许删除的一端称之为对头(front);向队列中插入新元素称之为入队或进队,入队后新元素变为队尾;从队列中删除元素称之为出队或离队,元素离队后,它后面的那个元素作为队头;可以以这个例子记忆:生活中排队买票,先来的就可以先拿到票,后来的人不允许插队,只可以排在队伍的后头,即队尾,则另一端则是队头;
双向链表:每个结点除数据外还有结点前驱和后继;
双向链表实现队列
定义链表的结点类的代码如下
package com.sxf0419duilie;
/**
* 链表的结点类
* @author sxf
*
*/
public class MyNode {
private Object obj;//结点内存储的数据对像
private MyNode child;//当前结点的后继结点
private MyNode parent;//当前结点的上一个结点
//创建结点时要传入数据对像,故构造方法要传入参数
public MyNode(Object obj){
this.obj=obj;
}
//定义获取数据对象的方法
public Object getObj(){
return obj;
}
/**
* 设置当前结点上一个结点的方法
* @param parent 传入的结点参数
*/
public void setParent(MyNode parent){
this.parent=parent;
}
/**
* 定义获得parent的方法
* @return 返回parent
*/
public MyNode getParent(){
return parent;
}
/**
* 设置当前结点后继结点child的方法
* @param child 传入的结点参数
*/
public void setChild(MyNode child){
this.child=child;
}
/**
* 定义获得当前结点后继结点child的方法
* @return 返回child
*/
public MyNode getChild(){
return child;
}
}
定义链表的类
package com.sxf0419duilie;
/**
* 双向链表实现队列的类
* @author sxf
*
*/
public class LinkList {
private MyNode front;//定义链表的第一个结点
private MyNode last;//定义链表的最后一个结点
/**
* 向队列中插入新的结点
* 只允许在队尾插入
* @param obj 新结点的数据对象
*/
public void add(Object obj){
//新建一个结点对象
MyNode newNode=new MyNode(obj);
//判断front是否为空
if(null==front){
front=newNode;
last=front;
}
else{
last.setChild(newNode);
newNode.setParent(last);
last=newNode;
}
System.out.print("新加入的元素为"+obj);
}
/**
* 求得队列的长度
* @param list 传入的要求长度的队列
* @return 返回队列的长度,注意此时应为num+1,原因是num从零开始且从头结点的后继开始判断
*/
public int getLength(){
int num=0;
MyNode node=front;//实例化一个结点并把头结点赋值给他,即从头开始数
//判断队列是否为空
if(null==node){
return num;
}
else{while(node.getChild()!=null){
node=node.getChild();
num++;
}
return num+1;
}
}
/**
* 获得指定位置的结点对象
* @param index 指定的索引位置
* @param list 传入的队列对象
*/
public MyNode getMyNode(int index,LinkList list){
if(index<0||list.getLength()<index){
//throw new java.lang.RuntimeException("下标越界");
System.out.print("index超过队列长度,请重新传入正确的index值");
return null;
}
else{
int i=1;
MyNode iNode=front;
while(i!=index){
iNode=iNode.getChild();
i++;
}
return iNode;
}
}
}
定义测试类
package com.sxf0419duilie;
public class Test {
public static void main(String [] args){
LinkList list=new LinkList();
list.add("aa");
list.add("bb");
list.add("cc");
list.getLength();
list.getMyNode(2, list);
}
}