天天看点

数据结构与算法Java版——双向链表

  今天分享的是双向链表的实现,双向链表其实很容易实现,只需要在节点Node类加一个前置节点的属性,再让其指向上一个节点就可以完成,还要注意的点就是双线链表的查询操作可以从head节点或tail节点开始,即双向查询。其他步骤和单链表就相似了。

  这个学期学习的数据结构这本书,所以我打算用Java实现其中表,队,栈,树。如果你有兴趣可以持续关注我后续操作。我的CSDN地址为

public Node getNodeByIndex(int index){
        if(index<0||index>size-1){
            throw new IndexOutOfBoundsException("索引越界");
        }
        //如果索引在前半段,则从head开始向后搜索,否则从tail开始向前搜索
        if(index<=size/2){
            Node node=head;
            for(int i=0;i<=size/2;i++,node=node.next)
            {
                if(i==index)
                {
                    return node;
                }
            }
        }else{
            Node node=tail;
            for(int i=size-1;i>size/2;i++,node=node.pre)
            {
                if(i==index)
                {
                    return node;
                }
            }
        }

    }           

  基本上单链表与双向链表区别就在这一部分,剩下的只需要注意插入删除节点时,需要记得是双向的,新插入的节点pre和next都需要分别指向前后节点,删除也要两边都要断开就像下图所示:

数据结构与算法Java版——双向链表

  剩下的操作就和单链表一样了,如果有何不明白可以参考我上一篇文章:数据结构与算法Java版——单链表的实现,到此所有表的实现就基本完成了。

  我们学习Java其实经常用到表,List就是我们常用的表,ArrayList就是顺序表的实现,LinkList是双向链表,两者各不同,所以用表的时候一定要考虑常用操作是什么,再来选择用什么表,最后附上两者优点与缺点表:

顺序表 链表
优点 顺序表中逻辑顺序与物理存储顺序一致,所以查找和读取时行性能强大 链表采用链式结构保存元素,所以插入删除时性能好;存储空间是动态分布的,因此空间不会像数组一样浪费。
缺点 每个顺序表底层都是一个数组实现的,所以存在着部分内存浪费;执行插入和删除时性能不好,可能需要移动大量的元素。 链表需要空间保存指针,所以会要牺牲一些空间。
上一篇: 有病!!