最近看了一下LinkedList,就自己动手简单封装了一下LinkBox
实现的功能:
add() get() remove() modify() size() 增删改查的这几个基本方法
也顺便复习了一下接口
box接口
写了上面几个基本方法
package mybox;
/*
* box接口
*/
public interface Box {
public void add(int item); //添加
public int get(int inder); //获取
public void remove(int inder); //删除
public void modify(int inder,int x); //修改
public int size(); //元素个数
}
接着是节点类的创建
package mybox;
/*
* 数据节点
*/
public class Node {
private Node prev; //上一个对象
private int item; //保存的数据
private Node next; //下一个对象
public Node(Node prev,int item,Node next) {
this.prev = prev;
this.item = item;
this.next = next;
}
public Node getprev() {
return this.prev;
}
public Node getnext() {
return this.next;
}
public int getitem() {
return this.item;
}
public void setprev(Node prev) {
this.prev = prev;
}
public void setnext(Node next) {
this.next = next;
}
public void setitem(int item) {
this.item = item;
}
}
最后是LinkBox的封装
package mybox;
/*
* 双向链表
* 继承Box
* implements 实现接口
* extends 继承
*/
public class LinkBox implements Box{
private Node first; //头节点
private Node last; //尾节点
private int size = 0; //有效元素个数
private void Check(int inder) { //检查序号是否合法
if(inder >= this.size || inder < 0) {
throw new ArithmeticException("序号异常");
}
}
private Node search(int inder) { //根据序号查找对应的Node
Node node = null;
Node l =last;
Node f = first;
if(inder >= size/2) //从后面遍历
{
for(int i=size-1; i>=inder; i--)
{
node = l;
l = node.getprev();
}
}
else //从前面遍历
{
for(int i=0;i<=inder;i++)
{
node = f;
f = node.getnext();
}
}
return node;
}
private void delem(Node node) { //删除
Node prev = node.getprev(); //这个节点的前一个
Node next = node.getnext(); //这个节点的后一个
if(prev == null) //如果他的前一个是空,说明他是头节点
{
node.setnext(null); //把他下一个置空
next.setprev(null); //把他下一个的上一个置空
first = next; //头节点
}
else if(next == null) //如果他的前一个是空,说明他是尾节点
{
node.setprev(null); //把他上一个置空
prev.setnext(null); //把他上一个的下一个置空
last = prev;
}
else //如果不是头节点和尾节点
{
prev.setnext(next);
next.setprev(prev);
}
size--; //元素减1
}
//添加元素至尾端
public void add(int item) {
Node l = last; //获取尾节点
Node newnode = new Node(l,item,null); //创建一个Node将数据包装起来
last = newnode; //再将自己设置为last
if(l == null) //如果之前的尾节点为空,那么新加进来的节点是第一个节点
{
first = newnode;
}
else //否则的话,之前的last的下一个,就是newnode的上一个
{
l.setnext(newnode);
newnode.setprev(l);
}
size++; //有效元素加1
}
//取对应序号的值
public int get(int inder) {
Check(inder); //检查参数是否合法
//如果没有抛出异常就继续下一步
Node node = search(inder);
return node.getitem();
}
//删除对应序号的值
public void remove(int inder) {
Check(inder); //检查参数是否合法
Node node = search(inder); //找到后
delem(node); //删除
}
//修改对应序号的值
public void modify(int inder,int x) //修改的序号,修改后的值
{
Check(inder); //检查参数
Node node = search(inder); //查找这个Node
node.setitem(x); //再修改
}
//获得元素个数
public int size() {
return size;
}
//打印所有元素
public void print()
{
Node l = first;
for(int i=0;i<size;i++)
{
System.out.println(l.getitem());
l = l.getnext();
}
}
}
经过这个的联系,让自己对LinedList更加熟悉了一点,以及双向链表的增删改查也更熟悉了
有错请留言,谢谢!