链表— 实现自定义队列
学习链表之前,斌哥带着我们回顾了一下之前学过的集合,也顺便把遗忘的知识复习一下吧。
列表在数据结构中分别表现为:数组和向量,链表,堆栈,队列。而相类似于队列等系统都有提供接口(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--; }