Java双向链表

由于太无聊,所以又写了个双向链表

package list;


/**
 * @author xuning
 * @date 2020/12/21
 */
public class MyLinkedList<E> {
    private ListNode<E> head = null;
    private ListNode<E> tail = null;
    private int size = 0;

    public MyLinkedList() {
        this.head = new ListNode<>();
        this.tail = head;
    }

    public MyLinkedList(E[] data) {
        this.head = new ListNode<>();
        this.tail = head;
        addElements(data);
    }

    public void addElements(E[] data) {
        ListNode<E> first = new ListNode<>(data[0]);
        this.size++;
        ListNode<E> temp = first;
        for (int i = 1; i < data.length; i++) {
            temp.next = new ListNode(data[i]);
            temp.next.pre = temp;
            this.size++;
            temp = temp.next;
        }

        if (this.head != this.tail) {
            this.tail.next = first;
            first.pre = this.tail;
        } else {
            this.head.next = first;
            first.pre = this.head;
        }
        this.tail = temp;
    }

    /**
     * 尾部添加结点
     *
     * @param value
     */
    public void addLast(E value) {
        ListNode<E> listNode = new ListNode(value);
        this.size++;
        if (this.head != this.tail) {
            this.tail.next = listNode;
            listNode.pre = this.tail;
            this.tail = listNode;
        } else {
            this.head.next = this.tail = listNode;
            listNode.pre = this.head;
        }
    }

    /**
     * 首部添加结点
     *
     * @param value
     */
    public void addFirst(E value) {
        ListNode<E> listNode = new ListNode<>(value);
        this.size++;
        if (this.head != this.tail) {
            listNode.next = this.head.next;
            listNode.next.pre = listNode;
            listNode.pre = this.head;
            this.head.next = listNode;
        } else {
            this.head.next = listNode;
            this.head.next.pre = this.head;
        }
    }

    public ListNode<E> getHead() {
        return this.head.next;
    }

    public ListNode<E> getTail() {
        return this.tail;
    }

    public E getFist() {
        return (E) this.head.next.val;
    }

    public E getLast() {
        return (E) this.tail.val;
    }

    public void removeFirst() {
        ListNode<E> temp = this.head.next;
        if (temp != null) {
            ListNode<E> next = temp.next;
            if (next != null) {
                this.head.next = next;
                this.head.next.pre = this.head;
                temp.val = null;
                temp.pre = null;
                temp.next = null;
                temp = null;
            } else {
                this.head.next = null;
                this.tail = null;
            }
            this.size--;
        }
        System.gc();
    }


    public void removeLast() {
        ListNode<E> temp = this.tail;
        this.tail = this.tail.pre;
        this.tail.next = null;
        this.size--;
        temp.val = null;
        temp.pre = null;
        temp.next = null;
        temp = null;
        System.gc();
    }


    public int size() {
        return this.size;
    }

    public boolean isEmpty() {
        return this.size == 0;
    }

    public void push(E e) {
        this.addLast(e);
    }

    public void pop() {
        this.removeLast();
    }

    public E peek() {
        return this.getLast();
    }

    public void enQueue(E e) {
        this.addLast(e);
    }

    public E deQueue() {
        E fist = this.getFist();
        this.removeFirst();
        return fist;
    }

    public E get(int index) throws IndexOutOfBoundsException {
        if (index < 0 || index >= this.size) {
            throw new IndexOutOfBoundsException("越界");
        }
        ListNode<E> temp = this.head;
        for (int i = 0; i <= index; i++) {
            temp = temp.next;
        }
        return temp.val;
    }

    public Object[] getElements() {
        Object[] elements = new Object[this.size];
        int index = 0;
        ListNode<E> temp = head.next;
        while (temp != null) {
            elements[index++] = temp.val;
            temp = temp.next;
        }
        return elements;
    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值