LinkedList底层源码实现

Posted 猴子特种兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedList底层源码实现相关的知识,希望对你有一定的参考价值。

/**
 * Created by chengbx on 2018/5/18.
 * LinkedList其实也就是我们在数据结构中的链表,这种数据结构有这样的特性:
 * 分配内存空间不是必须是连续的;
 * 插入、删除操作很快,只要修改前后指针就OK了,时间复杂度为O(1);
 * 访问比较慢,必须得从第一个元素开始遍历,时间复杂度为O(n);
 */
public class CbxLinkedList {
    private Node first;
    private Node last;
    private int size;

    public void add(Object object){
        //如果是第一个节点 那么在创建之后 第一个节点 也是最后一个节点
        Node n = new Node();
        if(first == null){
            n.setPrevious(null);
            n.setObject(object);
            n.setNext(null);
            first = n;
            last = n;
        }else{
            //直接往last后面添加新的节点
            n.setPrevious(last);
            n.setObject(object);
            n.setNext(null);
            //新增的节点为最后一个节点
            last.setNext(n);
            last = n;
        }
        size++;
    }
    public Object get(int index){
        RangeCheck(index);
        Node temp = getNodeByindex(index);
        return temp.getObject();
    }
    public int size(){
        return size;
    }

    private void RangeCheck(int index){
        if(index >= size){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public Node getNodeByindex(int index){
        Node temp = null;
        if(first!=null){
            temp = first;
            for(int i =0;i<index;i++){
                temp = temp.getNext();
            }
        }
        return temp;
    }
    public void remove(int index){
        Node temp = getNodeByindex(index);
        Node preNode = temp.getPrevious();
        Node nextNode = temp.getNext();
        preNode.setNext(nextNode);
        nextNode.setPrevious(preNode);
        size--;
    }
    public void add(int index,Object object){
        //获取对应索引的节点
        Node temp = getNodeByindex(index);
        if(temp!=null){
            Node preNode = temp.getPrevious();

            Node newNode = new Node();
            newNode.setPrevious(preNode);
            newNode.setObject(object);
            newNode.setNext(temp);

            preNode.setNext(newNode);
            temp.setPrevious(newNode);
        }
        size++;
    }

    @Test
    public void test(){
        CbxLinkedList cbxLinkedList = new CbxLinkedList();
        cbxLinkedList.add("aaa");
    }

}
class Node{
    private Node previous;
    private Object object;
    private Node next;

    public Node getPrevious() {
        return previous;
    }

    public void setPrevious(Node previous) {
        this.previous = previous;
    }

    public Object getObject() {
        return object;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Node() {
    }

    public Node(Node previous, Object object, Node next) {
        this.previous = previous;
        this.object = object;
        this.next = next;
    }
}

 

以上是关于LinkedList底层源码实现的主要内容,如果未能解决你的问题,请参考以下文章

LinkedList底层源码入门分析以及list集合选择

LinkedList底层源码入门分析以及list集合选择

LinkedList源代码深入剖析

集合系列—LinkedList源码分析

LinkedList源码分析

JDK源码学习之Arraylist与LinkedList