JAVA容器-模拟LinkedList实现(双链表)

一、概述

  LinkedList实质上就是双向链表的拓展的实现,我们将关注一下问题。LinkedList

  1、双向链表怎么来实现插入、删除、查询?

  2、利用二分法提高查询效率。

  3、不同步,线程不安全,需要使用Collections.synchronizedList()达到线程安全。

  4、简单说,LinkedList就是数据结构中关于数据操作吗?

二、模拟实现

1、实现总体图(初始状态)

2、论述双链表的实现思想

  双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。查询即从第一个节点,不断指向下一节点以便获得自己目标节点。删除、插入同理,最后修改目标节点的前后关系即可,就不多论述了。

3、采用二分法,向下遍历节点

 1  public Node node(int index){
 2         Node temp=first;
 3     //采用二分法遍历节点
 4         if(index<size<<1){
 5             for(int i=0;i<index;i++){
 6                 temp=temp.getNext();
 7             }
 8         }else{
 9             for(int i=size-1;i>index;i--){
10                 temp=temp.getPrevious();
11             }
12         }
13         return temp;
14     }

4、查询

1 public Object get(int index){
2         checkRange(index);
3         Node temp=null;
4         if(null!=first){
5             temp=node(index);
6         }
7         return temp.getObj();
8  }

5、插入一个元素(头部插入、尾部插入、中间插入)

public void add(int index,Object obj){
        checkRange(index);
        //移动指针,指向索引位置的节点
        Node temp=node(index);
        //从中间任任意一个位置插入
        if(first!=null){
            //创建一个新节点
            Node n=new Node();
            //修改当前节点的前后节点
            Node before=temp.getPrevious();
            n.setPrevious(before);
            n.setNext(temp);
            n.setObj(obj);
            before.setNext(n);
            temp.setPrevious(n);
        }
    }

    public void add(Object obj){
        Node n=new Node();
        //如果队头为空从队头插入
        if(first==null){
            //初始状态:头尾指针指向第一个节点
            n.setObj(obj);
            n.setPrevious(null);
            n.setNext(null);
            first=n;
            last=n;
        }else{
            //从队尾部插入
            n.setObj(obj);
            n.setPrevious(last);
            n.setNext(null);
            //上一个实现的next指向下一个节点
            last.setNext(n);
            last=n;
        }
        size++;
    }

6、删除

 1 public void remove(int index){
 2     checkRange(index);
 3      if (null!=first){
 4         //遍历直到目标节点
 5         Node temp=node(index);
 6          Node befor=temp.getPrevious();
 7          Node after=temp.getNext();
 8          after.setPrevious(befor);
 9          befor.setNext(after);
10           size--;
11       }
12 }

7、源于揭秘LinkedList的核心部分,就没有赘述所有实现的方法。

时间: 2024-10-12 16:15:23

JAVA容器-模拟LinkedList实现(双链表)的相关文章

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

Java 容器 & 泛型:二、ArrayList 、LinkedList和Vector比较

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 继续上一篇的容器文章认识容器,泥瓦匠慢慢带你们走进List的容器解说.今天泥瓦匠想说说 ArrayList .LinkedList和Vector比较. 一.List回顾 序列(List),有序的Collection,正如它的名字一样,是一个有序的元素列表.确切的讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 nu

java实现双链表(差点没写吐系列...)

刚才把单链表写完了,现在又把双链表写了,双链表和单链表的区别就是每个节点有prior和next两个指针,不同于单链表的一个next指针,而且,正是因为有这两个指针,所以双链表可以前后两个方向去移动指针, 同时,我所实现的双链表和单链表不同之处在于,主要体现在其不用每次都把指针从头结点开始遍历,而是根据实际情况从选择最优的线路去遍历,移动到想要的位置.差点写吐了....话不多说,上代码 1 package com.voole.linkedlist; 2 3 public class Test {

Java实现双链表

public class DoubleLink<T> { //存放第一个指针 private Node<T> firstNode; //存放最后一个指针 private Node<T> lastNode; //存放链大小 private int size; //构造函数 public DoubleLink() {} // --------------------------------add()系列---------------------------------- p

基于双链表 实现Java Queue队列

除了可以通过一维数组,单链表实现queue队列,还可以通过双链表实现queue队列. 在基于NLNode类实现双向链表的时候,为了使编程更加简洁,通常我们都要在最前端和最后端各设置一个哑元节点( Dummy node ).这两个节点分别称作头节点( Header node )和尾节点( Trailer node) ㈠,起哨兵( Sentinel)的作用.也就是说,它们并不存储任何实质的数据对象,头(尾)节点的next( prev)引用指向首(末)节点,而prev(next)引用为空.如此构成的双

JAVA 链表操作:单连表和双链表

主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个链条串联一起,轻易的可以实现数据的访问. 二.链表实现原理和必要性 这里只分析单链表和双链表.链表的实现过程是有些许复杂的,但是会带来许多好处.比如现在网购时代到来,商家发快递一般会将商品包装在盒子里并写上地址信息,快递

Java 容器 & 泛型:一、认识容器

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 容器是Java语言学习中重要的一部分.泥瓦匠我的感觉是刚开始挺难学的,但等你熟悉它,接触多了,也就"顺理成章"地知道了.Java的容器类主要由两个接口派生而出:Collection和Map. 一.Collection vs Collections 首先,Collection 和 Collections 是两个不同的概念.之所以放在一起,是为了更好的比较.Collection是容器层次结构中

给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析

LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明. 1.链表的概念 链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链表又分为单向链表和双向链表,而单向/双向链表又可以分为循环链表和非循环链表,下面简单就这四种链表进行图解说明.           1.1.单向链表 单向链表就是通过每个结点的指针指向下一个结点从而链接起来的结构,最后一个节点的next指向null.      1. 2.单向循环链表           单向循环