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

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

第一个不同文件类:

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

}