单向链表的数据添加,返回集合数据、通过索引获取数据 修改指定索引数据、判断数据是否在链表中存在、数据的删除、链表的清空操作

链表的接口设计:

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;//个数清零
		
	}

最后测试类太简单就不写了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值