[java数据结构]--java双向链表LinkedList的简单实现

前言

数据结构在java中的集合中,有很多数据结构的实现.
例如:线性结构中的:线性表(LinkedList),栈(Stack),队列(Queue)

代码实现和解析

1.LinkList自定义实现

/**
 * 双向链表 的增删改查
 * @author ccj
 *
 */
public class DoubleLinkList<E> {
    //头结点
    private Node<E> first;
    //尾结点
    private Node<E> last;

    //大小
    private int size;

    public int getSize() {
        return size;
    }


    //
    public DoubleLinkList(){
        first=null;
        last=null;
    }


    /**
     * 判断是否为空
     */
    public boolean isEmpty(){
        if(size==0){
            return true;
        }else{
            return false;
        }

    }

    /**
     * 插入节点,在头结点后插入
     */
    public void insertFirst(E e){
        //取链表头结点
        final Node<E> f = first;
        //新建节点 前驱为null,后继为头结点
        Node<E> node=new Node<E>(null,e,f);
        //将新的node作为头结点
        first=node;
        //如果原来的头结点为null,就说明链表为空,既头结点和尾结点都为同一个,
        //如果存在,就把node作为旧的头指针的前驱
         if (f == null)
                last = node;
            else
                f.prev = node;

        size++;


        first=node;
    }

    /**
     * 插入节点,在尾结点后插入
     * 类似于头结点插入
     */
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
    }

    /**
     * 根据下标得到元素
     * @param index
     * @return
     */
    Node<E> getObject(int index){
        //size >> 1 表示 二进制右移一位  同 size/2
        //前半部分时 从前向后找,后半部分时,从后向前找,这样效率高
        if(index>=size){
            throw new IndexOutOfBoundsException();
        }
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }


    }

    /**
     * 删除节点
     */
    public int deleteFirst(){

        Node<E> tmp=first;
        if(tmp==null){
            throw new NoSuchElementException();
        }
        //解除绑定
        Node<E> next=tmp.next;

        first = next;

        if(next==null){
            last=null;
        }else{
            next.prev=null;
        }
        size--;
        return 0;
    }


    /**
     * 更改结点
     */
    public void set(int index,E object){
        checkElementIndex(index);
    Node<E> node=getObject(index);
    node.item=object;
    }


     private void checkElementIndex(int index) {
            if (index>=size)
                throw new IndexOutOfBoundsException();
        }


    public void display(){
        Node current=first;
        while(current!=null){
            current.display();
            current=current.next;
        }
    }

    static class Node<E> {
        E item;
        //后继
        Node<E> next;
        //前驱
        Node<E> prev;
        /**
         * 
         * @param prev 
         * @param element
         * @param next
         */
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }


        /**
         * 显示
         */
        public void display(){
            System.out.println("data is "+item);

        }
    }



}

输出

--增加---

data is 3

data is 2

data is 1

--删除---

data is 2

data is 1

--改---

data is 0

data is 1

--查看---

data is 1

--大小为--
2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值