LinkedBox

链式结构
接口定义规则

public interface Box {
    public boolean add(int element);
    public int get (int index);
    public int  remove(int index);
    public int size();
}
package BOX;

public class Node {
    private Node prev;
    private int item;
    private  Node next;

    public void setPrev(Node prev) {
        this.prev = prev;
    }

    public void setItem(int item) {
        this.item = item;
    }

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

    public Node getPrev() {
        return prev;
    }

    public int getItem() {
        return item;
    }

    public Node getNext() {
        return next;
    }

    public Node(Node prev, int item, Node next) {
        this.prev = prev;
        this.item = item;
        this.next = next;
    }
}



public class LinkedBox implements Box{
    //数据结构
    //单向链表
    //双向链表
    private Node first; //记录首节点
    private Node last; //记录末尾节点
    private int size; // 记录有效元素个数


    private void linkLast(int element){
        // 获取链表的尾节点
        Node lNode = last;
        //创建一个新的对象,将新数据存起来
        Node newNode = new Node(lNode,element,null);
        //将新节点设置为尾节点
        last = newNode;
        // 需要做一个严谨的判断
        if (lNode == null) {// 如果原来尾节点没有对象,证明这个链表没有使用过
            first = newNode;// 将这个新节点设置为头节点
        } else {
            lNode.setNext(newNode);
        }
        // 有效元素个数增加一个
        size++;
    }

    private  void rangeCheck(int index){
        if (index<0 || index >= size){
            throw  new BoxIndexOUtOfBoundsException("Index:" + index + "Size" + size);
        }
    }

    //查找
    private Node findNode(int index){
        //判断索引在前半部分还是在后半部分
        Node targetNode = null;
        if (index <(size >> 1)){
                targetNode = first;
            for (int i = 0; i < index-1; i++) {
                targetNode = targetNode.getNext();
            }
        } else {
            targetNode = last;
            for (int i = size - 1; i >index; i--) {
                targetNode = targetNode.getPrev();
            }
        }
        return targetNode;
    }

    //负责将给定的node节点对象删除,并且保留所删除的数据
    private int unLink(Node targetNode){
        //获取item的值
        int oldValue = targetNode.getItem();
        //当前node的前一个
        Node prev = targetNode.getPrev();
        //当前node的下一个
        Node next = targetNode.getNext();
        if(prev == null){//当前节点是头节点
            first = next;//让下一个节点变成头节点
        }else{
            //prev.next = next;
            prev.setNext(next);
            //让targetNode对象的prev指向空
            //targetNode.prev = null;
            targetNode.setPrev(null);
        }
        if(next == null){//当前节点是尾节点
            last = prev;//让它前一个变成尾节点
        }else{
            //next.prev = prev;
            next.setPrev(prev);
            //让targetNode对象的next指向空
            //让后targetNode即可以被回收
            //targetNode.next = null;
            targetNode.setNext(null);
        }
        //让有效元素个数减少一个
        size--;
        return oldValue;



    }

    //-----------------------------------------------------------------------------------------------------
    @Override
    public boolean add(int element) {
        this.linkLast(element);
        return true;
    }

    @Override
    public int get(int index) {
        //判断index 是否合法
        this.rangeCheck(index);
        //找寻index对应位置的那个node对象,然后再将node对象中封装的数据取出来
        Node targetNode = this.findNode(index);
        //返回找到的Node对象内的数据
        return targetNode.getItem();
    }

    @Override
    public int remove(int index) {
        //判断index 是否合法
        this.rangeCheck(index);
        //找到索引位置的Node
        Node targetNode = this.findNode(index);

        return this.unLink(targetNode);
    }

    @Override
    public int size() {

        return size;
    }

    
}


异常类



public class BoxIndexOUtOfBoundsException extends RuntimeException {
    public BoxIndexOUtOfBoundsException(){

    }
    public BoxIndexOUtOfBoundsException(String msg){
        super(msg);
    }

}

上一篇:js面试题


下一篇:二叉排序树