java 实现链表

设计一个带表头单链表(链表中的元素属于同一类型对象,但对象的类型可以随意),提供以下操作:

1insert:在某个位置插入对象;

2delete:在某个位置删除对象;

3delete:删除链表中与x相同的元素;

4size:返回当前链表中对象的个数;

5isEmpty:判断链表是否为空;

6traverse:遍历链表,打印出所有的元素;

7getData:取得某个位置的对象。构造main函数进行测试。


import java.util.*;
	class Link<E>
	{
		public E data;
		public Link<E> next;
		public Link(E data)
		{
			this.data=data;
		}
	}
	class LinkList<E>
	{
		public Link<E> first;
		public int size;
		public void insertFirst(E value)//从表头插入数据,因为是next,所以只能从表头插入数据;
		{
			Link<E> d = new Link<E>(value);
			d.next=first;
			first=d;
			size++;
		}
		public void deleteFirst()//删除表头
		{
			Link<E> temp = first.next;
			first=null;
			first=temp;
			size--;   
		}
		public void isEmpty()//判断是否为空;
		{
			if(size==0)
				System.out.println("链表为空!");
			else
				System.out.println("链表不为空!");
		}
		public int size()
		{
			return size;
		}
		public void insert(int i,E  value)//在第i个位置插入数值;
		{
			Link<E> idata=new Link<E>(value);
			if(i<=0||i>size)
			{
				System.out.println("您输入的位置有误!请重新输入。");
			}
			else if(i==1)
				insertFirst(value);//插入表头;
			else
			{
				Link<E> find = first;
				int n=1;
				while(find!=null&&n<=size)
				{
					if(n==i-1)
						break;
					else
					{
						find=find.next;
						n++;
					}
				}
				idata.next=find.next;
				find.next=idata;
				size++;
				System.out.println("恭喜数据插入成功!");
			}
		}
		public void delete(int i)//在i位置删除对象;
		{
			if(i<=0||i>size)
			{
				System.out.println("您输入的位置有误!");
			}
			else if(i==1)//删除表头;
			{
				deleteFirst();
			}
			else
			{
				Link<E> find =first;
				int n=1;
				while(find.next!=null)
				{
					if(n==i-1)
						break;
					else
					{
						find=find.next;
						n++;
					}
				}
				find.next=find.next.next;
				size--;
				System.out.println("恭喜删除成功!");
			}
		}
		public void deletedata(E value)//删除值为value的对象;
		{
			Link<E> find=first;
			int flag=0;//设定标记
			if(first.data==value)//如果删除的是表头,调用删除表头方法;
			{
				deleteFirst();
			}
			else
			{
				while(find.next!=null)//因为是单链表,只有next,所以只能判断next;
				{
					if(find.next.data==value)
					{
						find.next=find.next.next;
						size--;
						flag=1;//如果成功删除数据,标记置1
						break;
					}
					else
					{
						find=find.next;
					}
				}
			}
			if(flag==1)
				System.out.println("数据删除成功!");
			else
				System.out.println("数据删除失败!");
		}
		public E getData(int i)//返回第i个元素的值
		{
			int n=1;
			Link<E> find=first;
			while(find!=null)
			{
				if(n==i)
					break;
				else 
				{
					find=find.next;
					n++;
				}
			}
			return find.data;
		}
		public void traverse()//遍历打印出所有元素;
		{
			Link<E> find=first;
			while(find!=null)
			{
				System.out.print(find.data+" ");
				find=find.next;
			}
			System.out.println(" ");
		}
	}
public class list {
	public static void main(String[] args) {
		LinkList<Integer> li=new LinkList<Integer>();
		System.out.println("-----------链表初始化-------------");
		System.out.print("请输入链表的元素个数:");//初始化链表数据;
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		for(int i=n;i>=1;i--)
		{
			System.out.print("请输入第"+i+"个元素:");
			int value=sc.nextInt();
			li.insertFirst(value);
		}
		li.isEmpty();//判断链表是否为空;
		System.out.println("链表中元素个数为:"+li.size());
		li.traverse();
		int value,i;
		System.out.print("请输入要查找的元素的位置:");
		i=sc.nextInt();
		System.out.println("第"+i+"个元素的值是:"+li.getData(i));
		System.out.print("输入要插入元素的位置和值:");
		i=sc.nextInt();
		value=sc.nextInt();
		li.insert(i,value);
		System.out.println("插入操作后链表中元素个数为:"+li.size());
		li.traverse();
		System.out.print("请输入要删除元素的位置:");
		i=sc.nextInt();
		li.delete(i);
		System.out.println("删除操作后链表中元素个数为:"+li.size());
		li.traverse();
		System.out.print("请输入要删除的元素的值:");
		value=sc.nextInt();
		li.deletedata(value);
		System.out.println("删除操作后链表中元素个数为:"+li.size());
		li.traverse();
	}

}


你可能感兴趣的:(java,类,对象,设计,单链表)