单链表

/*
 *特点:
 *通过前一个元素的指针域可以顺序找到后面元素所在的位置
 *因此所有操作全部是从第一个元素开始
 *ps:头结点只表示整个链表的起始位置,而无任何内容
 *
 *链表的操作
 *@isEmpty()-是否为空
 *@isHead()-是否为头部
 *@isTail()-是否为尾部
 *@find(Object data)-查找元素的位置,没有就返回-1
 *@add(Object data)-向链尾增加元素
 *@insert(int index, Object data)-插入元素
 *@replace(int index, Object data)-替换元素
 *@delete()-删除链尾元素
 *@deleteOf(int index)-删除指定元素
 *@print()-打印整条链表
 *@getHead()-得到链头
 *@getTail()-得到链尾
 *@getLength()-得到链长
 *
 */
 public class LinkList
 {
 	private Node head = null;
 	private Node tail = null;
 	private int length = 0;
 	public LinkList(){}
 	
 	public boolean isEmpty() {return 0 == length;}
 	
 	public boolean isHead(Node e) 
 	{
 		return null == e.getData() && head.getNext().equals(e.getNext());
 	}
 	
 	public boolean isTail(Node e)
 	{
 		return e.equals(tail) && null == e.getNext();
 	}
 	
 	public int find(Object data)
 	{
 		Node findE = head.getNext();
 		for(int i = 1; i <= length; i++)
 		{
 			if(data.equals(findE.getData()))
 				return i;
 			findE = findE.getNext();
 		}
 		return -1;
 	}
 	
 	public void add(Object data)
 	{
 		Node e = new Node(data);
 		if(null == head)
 		{
 			head = new Node();
 			head.setNext(e);
 		}
 		else
 			tail.setNext(e);
 		
 		tail = e;
 		length++;
 	}
 	
 	public void insert(int index, Object data)
 	{
 		if(1 > index || length < index)
 			throw new ArrayIndexOutOfBoundsException("out of range");
 		
 		Node insertE = new Node(data);
 		if(index == 1)
 		{
 			if(null == head)
 			{
 				head = new Node();
 				head.setNext(insertE);
 				tail = insertE;
 			}
 			else
 			{
	 			insertE.setNext(head.getNext());
	 			head.setNext(insertE);
	 		}
 		}
 		else
 		{
 			Node e = head.getNext();
	 		for(int i = 2; i < index; i++)
	 			e = e.getNext();

	 		insertE.setNext(e.getNext());
	 		e.setNext(insertE);
 		}
 		length++;
 	}
 	
 	public void replace(int index, Object data)
 	{
 		if(1 > index || index > length)
 			throw new ArrayIndexOutOfBoundsException("out of range");
 			
 		Node replace = head.getNext();
 		for(int i = 2; i <= index; i++)
 			replace = replace.getNext();
 		replace.setData(data);
 	}
 	
 	public void delete()
 	{
 		if(0 >= length)
 			throw new ArrayIndexOutOfBoundsException("the array is null");
 		
 		Node deleteE = head.getNext();
 		for(int i = 2; i < length; i++)
 			deleteE = deleteE.getNext();
 		tail.delete();
 		tail = deleteE;
 		tail.setNext(null);
 		length--;
 	}
 	
 	public void deleteOf(int index)
 	{
 		if(1 > index || length < index)
 			throw new ArrayIndexOutOfBoundsException("out of range");
 			
 		Node e = head.getNext();
 		
 		if(1 == index)
 		{
 			head.setNext(head.getNext().getNext());
 			e.delete();//删除元素
 			e = null;//删除元素
 		}
 		else
 		{
	 		for(int i = 2; i < index; i++)
	 			e = e.getNext();
	 		
	 		Node deleteE = e.getNext();	
	 		e.setNext(e.getNext().getNext());
	 		deleteE.delete();
	 		deleteE = null;
 		}
 		length--;
 		
 	}
 	
 	public void print()
 	{
 		Node next = head.getNext();
 		while(null != next)
 		{
 			System.out.print(next.getData());
 			next = next.getNext();
 		}
 		System.out.println();
 	}
 	
 	public Node getHead() {return head;}
 	
 	public Node getTail() {return tail;}
 	
 	public int getLength() {return length;}
 }
 
 class Node//节点类:包括自己的数据和下一个的指针
 {
 	private Object data;
 	private Node next;//指针
 	public Node(Object data)
 	{
 		this.data = data;
 		next = null;
 	}
 	public Node(){}
 	public void setNext(Node next) {this.next = next;}
 	public Node getNext() {return next;}
 	public void setData(Object data) {this.data = data;}
 	public Object getData() {return data;}
 	public void delete()
 	{
 		data = null;
 		next = null;
 	}
 }
 
 class Test
 {
 	public static void main(String[] args)
 	{
 		LinkList list = new LinkList();
 		/*
 		for(int i = 1; i <= 10; i++)
 			list.add(i);
 		
 		list.deleteOf(5);
 		list.insert(8,11);
 		
 		*/
 		list.add("s");
 		list.add("t");
 		list.add("u");
 		list.add("d");
 		list.add("y");
 		list.deleteOf(1);
 		list.insert(3, "u");
 		list.replace(2, "a");
 		
 		System.out.println("find: " + list.find("u"));
 		
 		Node next = list.getHead();
 		System.out.println(list.isHead(next));
 		list.print();
 		
 		System.out.println("length: " + list.getLength());
 	}
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值