数据结构之链表和数组实现队列

一、链表
链表就像一条隐形的链子,一环扣一环。链表的基本单位是结点,每个结点包括两个部分:该结点中的存储的数据,以及所连接的下个结点。
链表中数据的查找则必须从头开始,依次通过每个结点获得它所连接的下个结点。果使用链表直接存储数据,数据的添加过程将是一个非常繁琐的过程。

二、队列
队列也是一个存放东西的容器。但队列的使用比数组、链表更加灵活。一个完善的队列可以很方便的实现添加、删除、更改、获得长度、插入、查找等操作。因此通过把数组和链表转化为队列,可以实现对数组和链表的优化,增强其实用性。

三为什么用数组和链表实现队列

使用队列优化后的链表使用起来就可以非常简单
用链表实现队列代码如下
public class ListQueue<E> {
private Node<E> rootNode;
private Node<E> lastNode;
private int length = 0;
public void add(E obj){

Node<E> node = new Node<E>();

node.data = obj;

if(rootNode == null){

rootNode = node;
lastNode = node;
} else {

lastNode.next = node;

lastNode = node;
}
length++;
}


public int size() {
return length;

}

public E get(int index){
//队列的长度
int len = size();
//检查队列的边界
if(index < 0 || index > (len - 1))
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围");
int count = 0;

Node<E> tempNode = rootNode;
while(index != count){
count++;

tempNode = tempNode.next;
}
return tempNode.data;
}



private void print(Node<E> node){
if(node != null){
System.out.println(node.data);
print(node.next);
}
}

public void print(){
print(rootNode);
}
}


用数组实现队列
public class ArrayList implements List {
//定义一个类型为Object长度为0的数据
private Object[] arr = new Object[0];

public void add(Object obj) {
//新建一个数据,长度比原来的长度大1
Object[] arr2 = new Object[arr.length+1];
//将原来数组的数据复制到新的数组
for(int i = 0; i < arr.length; i++){
arr2[i] = arr[i];
}
//将要添加的数据放到新建数组的最后
arr2[arr2.length-1] = obj;
//用新建的数组替换掉原来的数组
arr = arr2;
}

//返回数组的长度
public int size() {
return arr.length;
}

//取某个位置对应的数据
public Object get(int index) {
if(index < 0 || index >= arr.length)
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围:0-"+(arr.length-1));
return arr[index];
}

//删掉指定位置的数据,并且返回被删掉的数据
public Object remove(int index) {
if(index < 0 || index >= arr.length)
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围:0-"+(arr.length-1));
//新建一个数据,长度比原来的长度小1
Object[] arr2 = new Object[arr.length-1];
//将index之前的数据复制到新数据
for(int i = 0; i < index; i++){
arr2[i] = arr[i];
}

//将index之后的数据复制到新数据
for(int i = index+1; i < arr.length; i++){
arr2[i-1] = arr[i];
}
//先保存被删除的数据
Object object = arr[index];
//替换原来的数组
arr = arr2;
return object;
}

//插入一个数据到指定位置
public void insert(int index, Object obj) {
if(index < 0 || index >= arr.length)
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围:0-"+(arr.length-1));
//新建一个数据,长度比原来的长度大1
Object[] arr2 = new Object[arr.length+1];
//将index之前的数据复制到新数据
for(int i = 0; i < index; i++){
arr2[i] = arr[i];
}

//将index及之后的数据复制到新数据
for(int i = index; i < arr.length; i++){
arr2[i+1] = arr[i];
}
//插入新数据
arr2[index] = obj;
//替换原来的数组
arr = arr2;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值