JAVA实现单向链表

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点。

1、首先定义一个链表节点实体类

public class LinkNode
{  public Object data=null;
   public LinkNode next=null;
	public LinkNode(Object data,LinkNode next)
	{this.data=data;
     this.next=next;
	}
}


2、实现链表类

public class LinkList
{private static LinkNode head=null;
 private static LinkNode tail=null;
 private static int count=0;
 private static LinkList INSTANCE =new LinkList();

   public static void add(Object data)
	{append(data);
	}

   public static void append(Object data)
	{
      LinkNode node=new LinkNode(data);
	  if(head==null)
		{head=node;
	     tail=head;
		}
		else
		{tail.next=node;
		 tail=node;
		}
		count++;
	}

	public static void push(Object data)
	{
      LinkNode node=new LinkNode(data);
	  if(head==null)
		{head=node;
	     tail=head;
		}
		else
		{node.next=head;
		 head=node;
		}
		count++;
	}

	public static void insert(int index,Object data)
	{ 
	  if(index>count){index=count;}
	   else if(index=0 && index<count)
		  { 
            if(index==0)
			  {data=head.data;
head=head.next;
			  }
			  else
			  {LinkNode tnode=head;
			   index--;
			   for(int i=0;i=0 && index0)
		{ 
			  if(head.data.equals(data))
			  {index=0;
			  }
			  else if(tail.data.equals(data))
			  {index=count-1;
			  }
			  else
			  { LinkNode tnode=head.next;
			    int i=1;
			    while(tnode!=null)
				{ 
				  if(tnode.data.equals(data))
			       {index=i;
				    break;
			       }
				   i++;
tnode=tnode.next;
				}
			  }
		}
	 return index;
	}

	public static boolean replace(int index,Object data)
	{boolean res=false;
		if(index>=0 && index<count)
		{
		  if(index==0)
			{head.data=data;
			}
			else if(index==count-1)
			{tail.data=data;
			}
			else
			{LinkNode tnode=head.next;
			 for(int i=1;i<index;i++)
			 { tnode=tnode.next;
			 }
			 tnode.data=data;
			}
			res=true;
		}

		return res;
	}

	public static LinkNode head()
	{return head;
	}

	public static LinkNode tail()
	{return tail;
	}

	public static int length()
	{return count;
	}

	public static void clear()
	{head=null;
	 tail=null;
	 count=0;
	}

	public static boolean isEmpty() {
		return  count == 0;
	}

	public String toString()
	{ String res="";
		LinkNode tnode=head;
		if(tnode!=null)
		{StringBuilder lbstr=new StringBuilder(tnode.data.toString());
		 while(tnode.next!=null)
		  {tnode=tnode.next;
	        lbstr.append(",").append(tnode.data.toString());
		 }
		 res=lbstr.toString();
		 tnode=null;
		 lbstr=null;
		}

		return res;
	}

	public static LinkList getInstance() {  
		 if(INSTANCE==null)
		{INSTANCE=new LinkList(); 
		}
		return INSTANCE;
       }
}


3、链表方法说明

void add(Object data)//等同push
void push(Object data)//链表前插入数据
void append(Object data)//链表后追加数据
void insert(int index,Object data)//链表指定位置插入数据,index为链表索引,从0开始计数
Object pop()//返回最后一个链表数据,并删除该节点
Object pop(int index)//返回指定索引数据,并删除该节点,index为链表索引,从0开始计数
boolean delete(int index)//删除指定索引节点,index为链表索引,从0开始计数
boolean contains(Object data)//判断链表是否包含指定数据
boolean replace(int index,Object data)//替换指定索引节点数据,index为链表索引,从0开始计数
int indexOf(Object data)//返回包含数据节点的索引,没有返回-1
LinkNode head()//返回链表头
LinkNode tail()//返回链表尾
int length()//返回链表长度
void clear()//清空链表
boolean isEmpty()//返回链表是否为空
String toString()//字符串输出链表内容

4、后记

此链表是一个全局链表,不足之处,希望大神给意见!