zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
    
    
  • 相关阅读:
    poj2352树状数组解决偏序问题
    Python中的输入(input)和输出打印
    Python中的输入(input)和输出打印
    IP协议
    IP协议
    Python中的可迭代Iterable和迭代器Iterator
    Python中的可迭代Iterable和迭代器Iterator
    Python中的变量和数据类型
    Python中的变量和数据类型
    TCP的三次握手和四次挥手和UDP协议
  • 原文地址:https://www.cnblogs.com/passer-byZe/p/12551506.html
Copyright © 2011-2022 走看看