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)

223208_158J_2537692.png

-------------------------------------华丽分割线-------------------------------------------------

学习数据结构后突然想用java实现链表,但是java学了很长时间了,都快忘干净了,很多用词不当的给我指正。谢谢大家。

转载于:https://my.oschina.net/wang520/blog/647982

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值