模仿集合功能写一个自定义链表集合


package com.gog.day6link;

/**
 * 
 * 
 * @author Gress
 *
 *		定义统一接口
 * @param <E>  用户给出上限泛型,控制用户的输入合法性
 */
public interface LinkInterface<E> {

	/**
	 * @param object  
	 * 增加元素
	 */
	public void add(E e);
	
	/**
	 * @param i     插入位置
	 * @param object  插入元素
	 */
	public void add(int i ,E e);
	
	/**
	 * @param i  移除位置i上的元素
	 * 
	 */
	public void remove(int i);
	
	/**
	 * @param i  
	 * @return  返回 i 位置的元素
	 */
	public E get(int i);
	
	/**
	 * @param i
	 * @param e
	 * 修改在  i位置的元素信息
	 */
	public void set(int i ,E e);
	
}
 

package com.gog.day6link;

/**
 * @author Gress
 *		实现接口 LinkInterface
 * @param <E> 用户给出上限泛型,控制用户的输入合法性
 */
public class LinkStudent<E> implements LinkInterface<E>  {

	StudentNode snode; // 当前 节点(包含学生对象 和上一个节点对象 )即第0个节点的node=null
	int size = -1;

	private static Object getstu; // 用于方法中的零食变量
	private static StudentNode getnode; // 用于方法中的零食变量
	private static String type;		//用于toString 

	@Override
	public void add(E student) {

		if (snode != null) { // 不是第一个元素对象
			size++;
			snode = new StudentNode<E>(student, snode);
		} else { // 即第一个添加的元素对象
			size++;
			snode = new StudentNode(student, null);
		}
	}

	@Override
	public void add(int i, E student) {
		if (i ==(size+1)) {
			snode =new StudentNode(student,snode);
		} else if(i>(size+1)||i<0){
			throw new RuntimeException("传参错误,此时StudentNode 大小只有  = " + size);
		}else if(i==0) {
			getsnode(0).node=new StudentNode(student, null);
		}else{
			getsnode(i).node= new StudentNode(student, getsnode(i-1));
		}
		
		size++;
	}

	@Override
	public void remove(int i) {
		if (i < 0 || i > size) {
			throw new RuntimeException("传参错误");
		} else if (i == size) {
			snode = snode.node;
		} else {
			if (i == 0) {
				getsnode(1).node=null;
			} else {
				getsnode(i+1).node=getsnode(i-1);
			}
		}
		size--;
	}

	@Override
	public E get(int i) {
		System.out.print("当前 size =" + size + "   ");
		getstu = snode.student;
		getnode = this.getsnode(i);
		getstu = getnode.student;
		return (E)getstu;
	}

	private StudentNode getsnode(int i) {
		 getnode = snode;
		if (i < 0 || i > size) {
			throw new RuntimeException("传参错误,此时StudentNode 大小只有  = " + size);
		} else {
			for (int j = 0; j < size - i; j++) {
				getnode = getnode.node;
			}
		}
		return getnode;
	}

	@Override
	public String toString() {
		 type = "size = " + size + "\n";
		getnode = snode;
		while (getnode.node != null) {
			type = type + getnode.student + "\n";
			getnode = getnode.node;
		}
		type = type + getnode.student;
		return type;
	}

	

	@Override
	public void set(int i, E e) {
		
		getsnode(i).student=e;
	}

}

/**
 * @author Gress
 *		这里可以考虑设计成实例内部类,不过实在不想在去写这个链表,就作废
 * @param <E>	设计一个类用来保存对象和上一个节点信息
 */
class StudentNode<E> {
	
	
	E student;
	
	 StudentNode<E> node ;
	

	public StudentNode(E student, StudentNode node ) {
		this.student = student;
		this.node = node;
	}

	public StudentNode() {
	
	}
	
	/**
	 * @return  获取节点的学生对象
	 */
	public E getStudent(){
		return student;
	}
	/**
	 * @return  获取节点的下一个指向的学生对象
	 */
	public StudentNode getNextNode(){
		return node;
	}	
}
package com.gog.day6link;

public class Student {
	private String name;
	private int age ;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
		//System.out.println(this); 
	}
	public Student() {
	}
	
	
}

package com.gog.day6link;

/**
 * @author Gress
 * double floate
 *
float double int byte char short long boolean  
 */
public class Test {
	

	
	public static void main(String[] args) {
		
		Student s1 = new Student("kava", 1);
		Student s2 = new Student("Java", 1);
		Student s3 = new Student("Hadop", 1);
		Student s4 = new Student("OOAD", 1);
		Student s5 = new Student("Tom", 1);
		Student s6 = new Student("GGR", 1);
		
		
		LinkStudent<Student> s= new LinkStudent<>();
		s.add(s1);
		s.add(s2);
		s.add(s3);
		s.add(s4);
		s.add(s5);
		System.out.println(s);
		System.out.println(" test----------------- ");
		
		s.set(0, s6);
		System.out.println(s);
		
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值