利用双向链表实现LinkedList

//双向链表的节点元素
public class Node {

    private Node previous;

    private Node next;

    private Object o;

    public Node getPrevious() {
        return previous;
    }

    public Node() {

    }

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

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

    public Node getNext() {
        return next;
    }

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

    public Object getO() {
        return o;
    }

    public void setO(Object o) {
        this.o = o;
    }

}

//利用双向链表实现的Linkedlist
public class MyLinkedList {

    private Node fist;

    private Node last;

    private int size;

    public void add(Object o) {
    Node node = new Node();
    if (fist == null) {// 如果是个空的链表,则设为首节点
        node.setO(o);
        node.setNext(null);
        node.setPrevious(null);
        fist = node;
        last = fist;
    } else {
        node.setO(o);
        node.setPrevious(last);
        node.setNext(null);
        last.setNext(node);
        last = node;
    }
    size++;
    }

    // 范围检查
    private void rangeCheck(int index) {
    if (index < 0 || index >= size) {
        try {
        throw new Exception();
        } catch (Exception e) {
        e.printStackTrace();
        }
    }
    }

    public Node node(int index) {
        rangeCheck(index);
        Node temp = null;
        if (index < (size >> 1)) {// >>效率最快
            temp = fist;
            for (int i = 0; i < index; i++) {
            temp = temp.getNext();
            }
        } else {
            temp = last;
            for (int i = 0; i < size - index - 1; i++) {
            temp = temp.getPrevious();
            }
        }
        return temp;
    }

    // 根据下标删除元素
    public void remove(int index) {
    Node node = node(index);//此时node变量指向链表中下标为index的节点
    if(node != null){
        Node front = node.getPrevious();
        Node behind = node.getNext();
        if(front!=null){//如果node是first节点 front 为null
        front.setNext(behind);
        }
        behind.setPrevious(front);
        size--;
    }
    }

    public Object get(int index){
    Node node = node(index);
    if(node!=null){
        return node.getO();
    }
    return null;
    }

    public void add(int index,Object o){
    Node node = node(index);
    Node newNode = new Node();
    newNode.setO(o);
    if(node!=null){
        newNode.setNext(node);
        newNode.setPrevious(node.getPrevious());
        node.setPrevious(newNode);
        size++;
    }
    }

    public static void main(String[] args) {
    MyLinkedList list = new MyLinkedList();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    System.out.println(list.get(2));
    list.remove(0);
    System.out.println(list.size);
    }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值