LinkedList手工实现01

LinkedList的底层是基于链表实现的,所以查询慢,增删改快,但是线程不安全,效率较高。

LinkedList类

/**
 * remove方法
 * add方法
 * get方法
 * getNode方法
 * @author HQ
 * @e-mail ahmashq95@gmail.com
 * @date 2018/11/2.
 */
public class LinkedList01 {

    private Node first;
    private Node last;
    private int size;

    public void remove(int index) {
        Node temp = getNode(index);
        if (temp != null) {
            Node up = temp.previous;
            Node down = temp.next;
            if (up != null) {
                up.next = down;
            }
            if (down != null) {
                down.previous = up;
            }

            //被删除的元素是第一个元素时
            if(index==0){
                first=down;
            }
            //被删除的元素是最后一个元素时
            if(index==size-1){
                last=up;
            }
            size--;
        }
    }

    // [ ]
    //["a","b"]
    public void add(Object object) {
        Node node = new Node(object);

        if (first == null) {

            node.previous = null;
            node.next = null;

            first = node;
            last = node;
        } else {
            node.previous = last;
            node.next = null;

            last.next = node;
            last = node;
        }
        size++;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("[");


        Node temp = first;
        while (temp != null) {
            stringBuilder.append(temp.element + ",");
            temp = temp.next;
        }
        stringBuilder.setCharAt(stringBuilder.length() - 1, ']');

        return stringBuilder.toString();
    }

    public Object get(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException("索引位置不合法" + index);
        }

        Node temp = getNode(index);
        return temp != null ? temp.element : null;

    }

    public Node getNode(int index) {
        Node temp = null;
        //size>>1 相当于除以2
        if (index < (size >> 1)) {
            temp = first;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }

        } else {
            temp = last;
            for (int i = size - 1; i > index; i--) {
                temp = temp.previous;

            }
        }
        return temp;

    }

    public static void main(String[] args) {
        LinkedList01 list01 = new LinkedList01();

        list01.add("a");
        list01.add("b");
        list01.add("c");
        list01.add("d");
        list01.add("e");
        list01.add("f");

        System.out.println(list01);
        System.out.println("------------");
        list01.remove(0);
        System.out.println(list01);
        System.out.println(list01.size);
        System.out.println("------------");

        list01.remove(0);
        System.out.println(list01);
        System.out.println(list01.size);
        System.out.println("------------");

        list01.remove(0);
        System.out.println(list01);
        System.out.println(list01.size);
    }
}

Node类

/**
 * @author HQ
 * @e-mail ahmashq95@gmail.com
 * @date 2018/11/2.
 */
public class Node {
    Node previous;//Last Node
    Node next;//next Node
    Object element;

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

    public Node(Object element) {
        this.element = element;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值