
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);
}
}