介绍
这篇文章将为大家详细讲解有关在java项目中怎么设计双链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>双链表的设计强>
双链表的主要优点是对于任意给的结点,都可以很轻易的获取其前驱结点或者后继结点,而主要缺点是每个结点需要添加额外的下一个域,因此需要更多的空间开销,同时结点的插入与删除操作也将更加耗时,因为需要更多的指针指向操作。双链表的结构图如下:,
,,
创建HeadDoubleILinkedList类并实现IlinekedList接口(和上篇博文的接口一样)
/* * *由zejian>包com.zejian.structures.LinkedList.doubleLinked;/* * *由zejian alt="在java项目中怎么设计双链表”>,,从图可以看出(a)和(b)属于同种情况,需要注意。下一个!=null的情况,否则就会抛空指针,而(c)的情况属于中间插入无需无需理会前面。接下来!=null的条件,因为中间插入时无论如何其后继结点时不会为零的,插入方法的实现代码如下:
/* * *插入结点 * @param指数 * @param数据 * @return */@Override 公共逻辑加(int指数T数据){ 如果(index<0 | | data=https://www.yisu.com/zixun/=null) 把新NullPointerException(“指数<0 | |数据==null”); int j=0; DNode=this.head面前;//查找要插入结点位置的前一个结点 (前面。下一个!=null & & j <指数){ + +; 前面=front.next; }//创建需要插入的结点,并让其前继指针指向前面,后继指针指向front.next DNode q=new DNode (数据、前front.next);//空双链表插入和尾部插入,无需此操作 如果前面。下一个!=null) {//更改front.next的前继指针 front.next。prev=问; }//更改前面的后继指针 前面。下一个=问;//在尾部插入时需要注意更新尾指向 如果(前面==this.tail) { this.tail=问; } 返回true; } <>强双链表的删除操作分析与实现强>
双链表的删除操作与插入操作原理上是相似的,我们可以看出(a) (b)是属于同种情况,需要防止p.next。prev抛空指针的情况,而对于(c)情况则无需关系p.next。上一页的值,删除的具体实现如下:
/* * *根据下标删除结点 * 1 .头删除 * 2,中间删除 * 3 .尾部删除,更新尾指向 * @param指数下标起始值为0 * @return */@Override 公共T删除(int指数){ int长度尺寸=(); T temp=零; 如果(index<0 | | index>大?| | isEmpty ()) { 返回临时; } DNodep=this.head; int j=0;//头删除/尾删除/中间删除,查找需要删除的结点(要删除的当前结点因此i<=指数) 而(p !=null&, j<=指数){ p=p.next; + +; }//当双链表只有一个结点时或尾部删除时,无需此步 如果(p.next !=null) { p.next.prev=p.prev; } p.prev.next=p.next;//如果是尾结点 如果(p==this.tail) { 这一点。尾=p.prev;//更新未结点的指向 } temp=p.data; 返回临时; } <>强双链表的查值操作分析与实现强>
双链表的查找值的操作与单链表并没有什么区别,只要找到需要查找的当前结点获取其值即可,如下:,
,
代码实现如下:
@Override 公共T get (int指数){ 如果(index>=0) { int j=0;//注意起始结点为this.head.next//如果起始点为this.head时,j的判断为j<=指数,//因为需要寻找的是当前结点而不是前一个结点。 DNodepre=this.head.next; 而(前!=零,,j<指数) { + +; pre=pre.next; } 如果(pre !=null) 返回pre.data; } 返回null; } <>强双链表的替换值操作分析与实现强>
双链表的替换值过程,需要先查找到需要替换的结点,这个过程跟获取值的过程是一样的,找到结点后直接替换值并返回旧值即可。比较简单直接上代码:
@Override 公共组T (int指数T数据){ 旧T=零; 如果(index> 0,和数据!=null) { int j=0; DNode在java项目中怎么设计双链表