JAVA用引用实现队列

JAVA内没有指针,取而代之的是引用,他比指针更加安全,c语言里队列里的每个元素,有两个区域,一个是指针域,指向下一个节点,还有一个是值的区域。

而JAVA内,把那个指针换成了节点,每个节点又包含有值区域,和下一个存储的节点。

package 队列;
public class Node {
/**
* 数据域
* 指向下一个位置的节点
*/
private  String data;
private  Node node;
public Node(String data,Node node) {
this.data=data;
this.node=node;

//值域和后继节点域
}
public String getData() {
return data;

//得到当前节点内的数值
}
public void setData(String data) {
this.data = data;

//设置当前节点内的数值
}
public Node getNode() {
return node;

//得到当前节点内的后继节点
}
public void setNode(Node node) {
this.node = node;
}
//设置当前节点的后继节点
}


上面设置了节点应有的属性


package 队列;
/**
 * 定义的一个队列的接口
 * @author oooo
 *
 */
public interface ListInterface {
/**
* 获得当前队列的长度
*/
public int getlenth();
/**
* 获得指定位置的元素节点
*/
public Node getNode(int index);
/**
* 插入元素节点,在队列末尾
* @return 
*/
public int add(String data);
/**
* 插入元素到指定位置
*/
public void add(String data,int Location,int length);
/**
* 删除指定位置的节点
*/
public void delet(int index);
}

//定义一个队列的接口属性,直接实现它,这一步只是让我们更加熟悉接口,就像我们经常是用的鼠标监听接口

package 队列;

//因为头指针是不能够随便乱动的,以后所有的操作均指望它,所以我们每次涉及到头结点的操作,都采用一个新的变量,然后再将头结点的值赋给他,保证头结点的正确性
public class List implements ListInterface{
public Node head;

//得到当前队列的长度的方法
public int getlenth() {
// TODO Auto-generated method stub

//将头结点赋值给一个新节点

Node node=head;
int count=0;

//计数器,得到的最终的值就是队列的长度
if(node==null)
{

//如果当前节点值为空,即代表当期的队列已经是空的
return 0;
}

//此时,队列不为空,遍历头结点,数量+1
count++;

//遍历头结点的下一个节点
node = node.getNode();

//System.out.println(node.getData()+"值");
while(node!=null)
{

//当前节点不为空,那么就遍历下一个节点
count++;
node=node.getNode();
}

//的到最后的长度
return count;
}


@Override
public Node getNode(int index) {

return null;
}

//得到该队列里所有的元素值
public void get() {
Node node=head;

//同样的方法遍历
while(node!=null)
{
System.out.println("aaa"+node.getData());
node=node.getNode();
}
}
@Override

//添加一个节点,默认在队尾
public int add(String data) {

//生成一个新的节点
Node node=new Node(data, null);
Node addhead=head;

//如果头结点就为空,那么把该元素放在第一个,形成新的头结点
if(head==null)
{
head=node;
return 1;
}

//次循环用来寻找最后一个节点,当其节点域里存储的东西为空,即代表已经找到
while(addhead.getNode()!=null)
{
addhead=addhead.getNode();
}

//将新节点放在最后一个节点的节点域
addhead.setNode(node);
return 0;
}


@Override

//在指定位置插入指定节点
public void add(String data, int Location,int length) {
int count=0;
Node addnode=head;

//先判断该插入的位置是不是合法,位置从0开始
if(Location>=length)
{
System.out.println("插入位置错误,请输入位置为"+0+"~"+(length-1));
}

//当插入位置不为头节点时
if(Location!=0)
{
count++;

//找到要插入节点的头一个位置
while(count<Location)
{
addnode=addnode.getNode();
count++;
}

//将该位置的节点放到新节点的节点域,再将新节点放入找到的位置的节点域,相当于已经插入了

Node change=addnode.getNode();
Node node=new Node(data, change);

addnode.setNode(node);
}

//当插入位置为0时,即代表插入的东西会成为新的头结点
if(Location==0)
{

//生成一个新的节点,将头结点放入新节点的节点域
Node node=new Node(data, head);

//将新节点变成头结点

head=node;
}
}


@Override

//删除指定位置的元素
public void delet(int index) {
Node node=head;
int count=0;
if(index!=0)
{
while(count<index)
{
count++;
node=node.getNode();
}

//找到该位置的前一位,将他的节点域写入该节点的后一位节点,相当于删除,
Node q=node.getNode();
System.out.println("q"+node.getData());
node.setNode(q.getNode());
}

//删除头结点
else
{

node=node.getNode();
head=node;
}
}

}

package 队列;

//几个操作
public class Test {
public static void main(String[] args) {
List list=new List();
list.add("节点1");
list.add("节点2");
System.out.println("长度"+list.getlenth());
list.get();
list.add("哈哈哈", 1,list.getlenth());
System.out.println("YYYYYYYYYYYYYYY");
list.get();
System.out.println(list.getlenth());
list.add("耶耶耶", 0,list.getlenth());
System.out.println("YYYYYYYYYYYYYYY");
list.get();
System.out.println(list.getlenth());
list.delet(2);
System.out.println("YYYYYYYYYYYYYYY");
list.get();
System.out.println(list.getlenth());
list.delet(0);
System.out.println("YYYYYYYYYYYYYYY");
list.get();
System.out.println(list.getlenth());
}
}



长度2
aaa节点1
aaa节点2
YYYYYYYYYYYYYYY
aaa节点1
aaa哈哈哈
aaa节点2
3
YYYYYYYYYYYYYYY
aaa耶耶耶
aaa节点1
aaa哈哈哈
aaa节点2
4
q哈哈哈
YYYYYYYYYYYYYYY
aaa耶耶耶
aaa节点1
aaa哈哈哈
3
YYYYYYYYYYYYYYY
aaa节点1
aaa哈哈哈
2




哈哈哈哈,大功告成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值