链式结构
接口定义规则
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); } }
来源:https://www.cnblogs.com/passer-byZe/p/12551506.html