泛型、创建链表、重写打印、返回索引位置的值、返回指定节点、删除节点、指定位置添加节点、判断索引异常

需要两个类,一个表示节点信息和指针,一个表示节点位置并实现链表

第一个不同文件类:

public class node {
node next;  //指向下一个节点
node pre;   //指向上一个节点
Object obs;  //节点数据

public node(Object obs)
{
    this.obs=obs;
}

}

第二个实现类:

package hell;
public class test<E> {
private node first; //节点首位置
private node last;  //节点实时位置
private int size;  //记录节点个数

public void add(E obs) //添加元素添加链表 { node p=new node(obs); if(first==null) //如果是第一个元素 { first=p; //定位first last=p; //定位实时last } else { last.next=p; //将第二个节点与第一个节点双向链接,并使得第二个节点指向null p.pre=last; p.next=null; last=p;

}
size++;

} public void checkIndex(int index) //判断索引异常 { if(index<0||index>=size) { throw new RuntimeException("索引异常"); } } public E get(int index) //返回索引的值,根据索引大小来判断查找顺序 { checkIndex(index); node p; if(index>=size/2) { p=last; for(int i=size-1;i>index;i--) { p=p.pre; } } else { p=first; for(int i=0;i<index;i++) { p=p.next; } } return (E)p.obs; }

public node getNode(int index) //返回指定节点 { checkIndex(index); node p=first; for(int i=0;i<index;i++) { p=p.next; } return p;

} public void rem(int index)//删除节点 { checkIndex(index); node p=getNode(index); node up=p.pre; node down=p.next; if(up!=null) //判断up和down是否为空,不能让空指针指向其他,只适合一般节点和尾节点 { up.next=down; //删除尾节点时,使得尾节点的上一个节点指向空,从而删除尾节点 } if(down!=null) { down.pre=up; //删除头节点时,只是让头节点的下一个节点指向上一个节点为空,但头节点 //依旧能指向下一个节点,故无法删除 } if(index==0) //删除头节点 { first=p.next; } if(index==size-1) { last=null; }

} public void add(int index,E obs)//指定位置添加节点 { checkIndex(index); node newnode=new node(obs); node p=getNode(index); node up=p.pre;

up.next=newnode;
newnode.pre=up;
newnode.next=p;
up=newnode;

} public String toString()//重写toString方法 { StringBuilder s=new StringBuilder(); s.append("["); node p=first; while(p!=null) { s.append(p.obs+","); p=p.next; } s.setCharAt(s.length()-1, ']'); return s.toString();

}

public static void main(String[]args) { test<String> link=new test<>(); link.add("a"); link.add("b"); link.add("c"); System.out.println(link); System.out.println(link.get(2)); node p=link.getNode(2); System.out.println(p.obs); link.rem(0); System.out.println(link); link.add(3,"d"); System.out.println(link); }

}