您的位置:首页 > 编程语言 > Java开发

java语言实现简单单链表链式储存结构。插入删除等操作。(有个地方看不出错误来,已经标注,望指正)

2016-03-26 00:00 866 查看
摘要: java并不像c语言c++等这种语言存在指针,我们知道链表是由结点构成的,那么我们可以用一个对象代表一个结点(Node)。每个结点中储存数据和对下一个结点对象的引用。

首先我们定义链表的结构,期中有两个公有成员,分别储存数据和下一个结点对象的引用。代码如下:

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学了很长时间了,都快忘干净了,很多用词不当的给我指正。谢谢大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息