package cn.edu.bit.cs;
public class MyList {
public static void main(String args[])
{
List objectList=new List();//创建新的list对象
Boolean b = Boolean.TRUE;
Character c = new Character('$');
Integer i = new Integer(34567);
String s = "hello";
//尝试使用insert的方法
objectList.insertFront(b);
objectList.print();
objectList.insertFront(c);
objectList.print();
objectList.insertBack(i);
objectList.print();
objectList.insertBack(s);
objectList.print();
Object removeObject;
//remove可能出现异常的情况,注意抛出异常和catch
try
{
removeObject=objectList.removeFromFront();
System.out.println(removeObject.toString()+"removed");
objectList.print();
removeObject=objectList.removeFromFront();
System.out.println(removeObject.toString()+"removed");
objectList.print();
removeObject=objectList.removeFromBack();
System.out.println(removeObject.toString()+"removed");
objectList.print();
removeObject=objectList.removeFromBack();
System.out.println(removeObject.toString()+"removed");
objectList.print();
}
catch(EmptyListException e)//创建异常的对象
{
System.err.println("\n"+e.toString());
}
}
}
class EmptyListException extends RuntimeException {
private static final long serialVersionUID = 5130245130776457112L;
public EmptyListException(String name) {
super("The " + name + " is empty");
}
}//出现异常的状态,此时list为空,但还是从中移开节点
class ListNode
{
Object data;
ListNode next;//指向下一个list,相当于指针
ListNode(Object o) {
this(o, null);
}
ListNode(Object o,ListNode nextNode)
{
data=o;//当前的对象指向Object o
next=nextNode;//指向下一个指针
}//创建listnode指向object o以及下一个listnode
Object getObject()
{
return data;//data指向当前的对象
}
Object getNext()
{
return next;
}
}
class List
{
private ListNode firstNode;
private ListNode lastNode;
private String name;
//创建list
public List(String s)
{
name=s;
firstNode=lastNode=null;
}//命名当前的list为s,创建空的list
public List()
{
this("list");
}//为list命名
public synchronized void insertFront(Object insertItem)
//synchronized关键词保证当前只进行一个线程,在头部插入
{
if(isEmpty())//检测是否为空
{
firstNode=lastNode=new ListNode(insertItem);
}//为空时,头部和尾部的指针相同
else
{
firstNode=new ListNode(insertItem,firstNode);
}
}
public synchronized void insertBack(Object insertItem)
{
if(isEmpty())
{
firstNode=lastNode=new ListNode(insertItem);
}
else
{
lastNode=lastNode.next=new ListNode(insertItem);
}
}//注意头部和尾部插入的区别
public synchronized Object removeFromFront() throws EmptyListException
{
Object removeItem=null;
if(isEmpty())
{
throw new EmptyListException(name);
}//出现异常并抛出
removeItem=firstNode.data;
if(firstNode.equals(lastNode))//前后节点相等的情况
{
firstNode=lastNode=null;
}
else
{
firstNode=firstNode.next;
}//否则移动前节点
return removeItem;
}
public synchronized Object removeFromBack() throws EmptyListException
{
Object removeItem=null;
if(isEmpty())
{
throw new EmptyListException(name);
}
removeItem=firstNode.data;
if(firstNode.equals(lastNode))
{
firstNode=lastNode=null;
}
else
{
//往前移动lastnode
ListNode current=firstNode;
while (current.next!=lastNode)
{
current=current.next;
}//移动至lastnode前面一个点
lastNode=current;
current.next=null;
}//注意lastnode移动时,应该向前移动
return removeItem;
}
public synchronized boolean isEmpty() {
return firstNode == null;
}
public synchronized void print()
{
if(isEmpty())
{
System.out.println("Empty"+name);
return ;
}
System.out.println("The"+name+"is:");
ListNode current=firstNode;
while (current!=null)
{
System.out.println(current.data.toString()+" ");
current=current.next;
}
System.out.println("\n");
}
}
1、理清楚线性表的操作,定义Java中定义线性表的操作与C语言类似,同样有指向当前的node,也有指向下一个节点的node,注意基本的插入、删除、判断是否为空等基本的操作
2、注意定义listnode时,同时要定义获取的方法,首先创建相应的对象,并且定义获取的方法,注意类定义的特点
3、实现两头插入的操作,若当前链表为空,即头节点和尾节点相同,给头尾节点赋相同的值,若不同,则移动相应的头尾节点
4、注意异常检查写完整,在remove的时候,可能出现异常的情况,即当前链表已经为空了,还是在remove,所以要抛出相应的异常,并进行处理
5、removeback时要注意,应该将节点向前移动,与firstnode的移动有区别