链表— 实现自定义队列
学习链表之前,斌哥带着我们回顾了一下之前学过的集合,也顺便把遗忘的知识复习一下吧。
列表在数据结构中分别表现为:数组和向量,链表,堆栈,队列。而相类似于队列等系统都有提供接口(java.util.List)来让我们继承,可直接使用接口下定义的方法,一个队列的方法无非也就是增,删,改,查。
虽然系统提供了那么多方法,但是数组,List等都是有序的存储,在获取某个特定位置的元素,或者删除或插入一个元素时,尤其当存储的数据较多时,其耗费的时间比较长,所以此时就需要用到链表。
链表是一种物理存储单元上非连续,非顺序的存储结构,因为它数据元素的逻辑顺序是通过链表中的指针链次序实现的,所以相对于线性表顺序结构,链表比较方便插入和删除操作。链表有单链表和双链表之分,相较于单链表,双链表可以实现对某个元素的前一个元素进行操作,免去了又要从头开始查找的麻烦。
双链表实现自定义队列 部分代码示例:
数据的查找:
public Node get(int index){
if(index<0||index>size-1){//减一是因为从0开始
//抛出异常
throw new RuntimeException("下标越界了");
}else {//从第一个结点开始找 并计数 直到 计数计到所给定的位置
Node node=first;
int count=0;
while(count!=index){//如果计数不等于给定位置 就找下一个
node=node.next;
count++;
}
return node;
}
}
数据的插入:
public boolean insert(String element,int index){
if(index<0||index>=size){
throw new RuntimeException("下标越界了");
}else {
//创建一个新结点
Node NewNode=new Node(element);
//得到当前索引位置的结点
Node node=this.get(index);
if(index==0){//如果在第一个位置插入
first=NewNode;
}else {
//得到前一个结点
Node Pnode=node.pre;
//设置新插入的结点与当前节点的前一个结点的引用关系
Pnode.next=NewNode;
NewNode.pre=Pnode;
}
//设置新插入的结点与当前结点的引用关系
NewNode.next=node;
node.pre=NewNode;
size++;
}
return true;
}
数据的删除:
public void delete(int index){
if(index<0||index>=size){
throw new RuntimeException("下标越界了");
}else {
//得到当前索引位置的结点
Node node=this.get(index);
//得到前一个结点
Node Pnode=node.pre;
//得到后一个结点
Node Nnode=node.next;
if(Pnode==null){//此结点为头结点
first=Nnode;
}else if(Nnode==null){//此结点为末结点
node.next=null;
}else{//此结点为中间结点
Pnode.next=Nnode;
Nnode.pre=Pnode;
}
}
//删除元素之后 相应的链表长度要减一
size--;
}