public interface Ilink<E> {//设置泛型避免安全隐患
//数据增加的方法
public void linkadd(E e);
public int size();//获取数据的个数
public Object toArray();//返回集合数据
public boolean isEmpty();//空集合判断
public E get(int index);//根据索引的值获取数据
public void set(int index,E date);//修改指定索引位置的数据
public boolean datecontains(E date);//判断指定数据在链表中是否存在
public void remave(E e);//删除数据 要先判断数据是否在这个链表中
public void clean();//清空链表
}
实现类的设计
public class Dateadd<E> implements Ilink<E> {//负责处理用户的请求类
private class Node{//内部类用来保存节点的数据关系
private E date;//存数据
private Node next;//存下个节点的信息
public Node(E date) {
this.date = date;
}
//第一次调用this.root.addNode() 此时的this=Dateadd.root
//第二次调用this.root.addNode() 此时的this=Dateadd.root.next
//第三次调用this.root.addNode()此时的this=Dateadd.root.next.next
public void addNode(Node newnode) {
if(this.next==null) {//此时的this=Dateadd.root
this.next=newnode;
}else {
this.next.addNode(newnode);
}
}
public void toArray() {//添加数据到开辟好的数组中
Dateadd.this.returndate [Dateadd.this.foot++]=this.date;
if(this.next!=null) {//还有下一个数据
this.next.toArray();
}
}
public E getdate(int index) {
if(Dateadd.this.foot++ == index) {//判断当前脚标是否符合
return this.date;
}
return this.next.getdate(index);
}
public void setdate(int index,E date) {
if(Dateadd.this.foot++ == index) {//判断当前脚标是否符合
this.date=date;
}
this.next.setdate(index,date);
}
public boolean datecontains(E date) {//判断数据是否存在
if(date.equals(this.date)) {
return true;
}
if(this.next!=null) {//判断还有没有下一个node
return this.next.datecontains(date);
}
return false;
}
public void remavedate(Node lastnode ,E e) {
if(e.equals(this.date)) {
lastnode.next=this.next;
}else if(this.next != null) {//判断后续还有没有节点 向后继续删除
this.next.remavedate(this, e);
}
}
}
//以下为Dateadd类中定义的属性
private Node root;//定义一个数据链表的首位(火车头) 根节点
private int count;//定义初始的node个数
private int foot;//定义数组的脚标
private Object[] returndate;//返回的数据数组
//以下为Dateadd类中定义的方法
//覆写接口的方法
@Override
public void linkadd(E e) {
// TODO Auto-generated method stub
//判断用户添加的数据是否为空
if(e == null) {
return;//结束调用添加数据的方法
}
Node newnode= new Node(e);//创建一个新的节点
if(this.root ==null) {//判断有没有根节点
this.root=newnode;//第一个节点就作为根节点
}else {
this.root.addNode(newnode);//将新节点保存在新的位置
}
count++;
}
// 覆写接口中获取数据个数的方法
@Override
public int size() {
// TODO Auto-generated method stub
return count;
}
//覆写返回集合数据的方法
@Override
public Object toArray() {
// TODO Auto-generated method stub
if(this.isEmpty()) {//判断集合是否为空
return null;//返回空值
}
//如不为空
int foot = 0;//脚标清零
this.returndate= new Object[this.count];//根据已有的链表的长度来开辟数组
this.root.toArray();//利用node类进行数据的获取 第一次调用
return this.returndate;
}
//空集合判断方法
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return count==0 ;
}
//覆写根据索引的值获取数据
@Override
public E get(int index) {
// TODO Auto-generated method stub
if(this.count<=index) {
return null;
}
//此时因该通过node的来
this.foot=0;//脚标清零
return this.root.getdate(index);
}
//修改指定索引位置的数据
@Override
public void set(int index, E date) {
// TODO Auto-generated method stub
if(this.count<=index) {
return ;
}
//此时因该通过node的来
this.foot=0;//脚标清零
this.root.setdate(index,date);
}
//覆写判断指定数据在链表中是否存在的方法
@Override
public boolean datecontains(E date) {
// TODO Auto-generated method stub
if(date==null) {//判断用户给的值是否为空
return false;
}
return this.root.datecontains(date);
}
//删除指定数据
@Override
public void remave(E e) {
// TODO Auto-generated method stub
if(e==null) {//判断所删数据是否为空
return;
}else if(this.datecontains(e)) {//在判断数据是否在链表中存在
if(e.equals(this.root.date)) {//判断是否为根节点数据
this.root=this.root.next;//根节点的下一个节点给根节点
this.count--;//执行完删除要修改链表的长度
}
}else {
this.root.next.remavedate(this.root, e);
this.count--;
}
}
//清空链表
@Override
public void clean() {
// TODO Auto-generated method stub
this.root=null;//根节点后续都不要了
this.count=0;//个数清零
}