java语言实现简单单链表链式储存结构。插入删除等操作。(有个地方看不出错误来,已经标注,望指正)
2016-03-26 00:00
866 查看
摘要: java并不像c语言c++等这种语言存在指针,我们知道链表是由结点构成的,那么我们可以用一个对象代表一个结点(Node)。每个结点中储存数据和对下一个结点对象的引用。
首先我们定义链表的结构,期中有两个公有成员,分别储存数据和下一个结点对象的引用。代码如下:
接下来我们开始写链表的常用的操作函数。其中有个错误,已经标注出来,希望大家给我提示一下。代码如下:
接下来是测试函数,最后一个插入数据的函数存在错误 所以我选择在第一个元素之前插入数据,这样是没错的。只有在第一个之前插入没事。输入的数据为11,12,13,14,15,16,17代码如下:
运行结果为:(注意:输入的数据为11,12,13,14,15,16,17)
-------------------------------------华丽分割线-------------------------------------------------
学习数据结构后突然想用java实现链表,但是java学了很长时间了,都快忘干净了,很多用词不当的给我指正。谢谢大家。
首先我们定义链表的结构,期中有两个公有成员,分别储存数据和下一个结点对象的引用。代码如下:
import java.util.Scanner;//测试时需要输入数据。 class Lnode//定义链表的结构 { public int data;//结点的数据域。 public Lnode next;//下一个结点对象的引用。 public Lnode(int data) { this.data=data; } }
接下来我们开始写链表的常用的操作函数。其中有个错误,已经标注出来,希望大家给我提示一下。代码如下:
class Linklist//此类包含操作链表的一些方法; { public Lnode currentadd;//插入时将用到该元素; public Lnode head;//头结点 public Lnode current;//始终指向当前操作的结点 public void addListinsert(int data)//输入一个元素,将插入链表的后面,如果链表为空将构建链表。 { if(head==null)//判断表头是否为空 { head=new Lnode(data); current=head; } else {//如果已经存在头结点,创建新的结点,放在前结点的后面。 current.next=new Lnode(data); current=current.next; } } public void PrintTraverse()//用于输出所有的元素值。 {//用于输出所有的元素 if(head==null) {//判断链表的头是否为空,如果为空说明链表不存在。 return; } else { current=head;//如果链表不为空,则将current引用(相当于指针的指向)头结点。 while(current!=null)//遍历整个链表。 { System.out.print(current.data+" "); current=current.next; } } System.out.println();//为了方便显示,每次输出完毕后换行。 } public void Listdelete(int n)//输入要删除元素的位序,用于删除操作。 { int i=1;//i为计数器,始终为current所引用的元素。 current=head; if(n==1)//首先判断是不是头结点,如果是需要修改head的指向。 { current=head.next;head=head.next; } else{//如果不是头结点,首先找到n-1个元素,让n-1元素的next指向n+1。 while(current!=null&&i<n-1) { ++i;current=current.next; } current.next=current.next.next; } } public int LocateElem(int data)//查找与传入数据相同的元素。 { int i=0; current=head; while(current!=null)//遍历整个链表 { i++; if(current.data==data)break;//如果找到相同的元素则跳出循环,结束遍历。 current=current.next; } return i; } public int ListLength()//测试链表的长度 { int i=0;//i为计数器. current=head; while(current!=null)//遍历链表。 { i++; current=current.next; } return i; } public void Listinsert(int n,int data)//在第n个元素之前插入数据data; { int i=1; current=head; //注意这个函数存在错误,本人还没有发现为什么错。 if(n==1) { //假如在第3个元素之前插入数据,它直接将第三个元素的值修改 current=new Lnode(data); current.next=head; //错误!!!!注意//请大家帮忙指正。万分感谢》。 head=current; //只有在第一个元素之前插入才正确。 } else { while(current!=null&&i<n-1) //***************************** { //**此插入函数存在错误。 current=current.next; i++; //*********************** } currentadd=new Lnode(data); //请大家看到给我指正。我会明天在自己看看,可能自己绕圈出不来了 currentadd.next=current.next.next; current.next=currentadd; } } }
接下来是测试函数,最后一个插入数据的函数存在错误 所以我选择在第一个元素之前插入数据,这样是没错的。只有在第一个之前插入没事。输入的数据为11,12,13,14,15,16,17代码如下:
public class Test { public static void main(String[] args) { String str; int data,n; Scanner sc=new Scanner(System.in); Linklist link=new Linklist(); System.out.println("如果想插入元素请按Y,输入完毕请按N"); str=sc.next(); while(str.equals("Y")) { System.out.println("请输入整形数据"); data=sc.nextInt(); link.addListinsert(data); System.out.println("如果想继续插入元素请按Y,输入完毕请按N"); str=sc.next(); } System.out.print("链表的所有元素为:"); link.PrintTraverse(); System.out.print("请输入要删除的元素的位序: "); n=sc.nextInt(); link.Listdelete(n); System.out.print("删除后链表的所有元素为:"); link.PrintTraverse(); System.out.print("链表的长度为:"+link.ListLength()+"\n"+"你想在第几个元素之前插入:"); n=sc.nextInt(); System.out.print("请输入要插入的数据:"); data=sc.nextInt(); link.Listinsert(n, data); System.out.print("插入后链表的所有元素为:"); link.PrintTraverse(); System.out.println("请输入你要查找的元素,将返回其位序"); data=sc.nextInt(); System.out.print("该元素的位序为:"+link.LocateElem(data)); } }
运行结果为:(注意:输入的数据为11,12,13,14,15,16,17)
-------------------------------------华丽分割线-------------------------------------------------
学习数据结构后突然想用java实现链表,但是java学了很长时间了,都快忘干净了,很多用词不当的给我指正。谢谢大家。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- [C/C++]反转链表
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序