链式结构
接口定义规则
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);
}
}