Java实现线性表的经典实例

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的移动有区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值