文档章节

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

奔跑的码农
 奔跑的码农
发布于 2016/03/26 22:36
字数 1171
阅读 88
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

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学了很长时间了,都快忘干净了,很多用词不当的给我指正。谢谢大家。

© 著作权归作者所有

奔跑的码农

奔跑的码农

粉丝 15
博文 34
码字总数 41797
作品 0
海淀
程序员
私信 提问
08《Java核心技术》之Vector、ArrayList、LinkedList有何区别?

一、提出问题 我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我们最早接触到的 C 语言,需要自己实现很多基础数据结构,管理和操...

飞鱼说编程
2018/10/11
33
0
数组:为什么很多编程语言中数组都从0开始编号?

数组: 数组是一种线性表数据结构。用一组连续的内存开间,存储具有相同类型的数据。 线性表: 数据像线一样的结构,只有前和后两个方向,除了数组,链表,队列,栈也是线性表结构。 非线性表...

万万没想到10086
08/09
0
0
数据结构——Java实现单链表

一、分析   单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点由元素和指针构成。在Java中,我们可以将单链表定...

牛cattle
04/22
0
0
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/23
0
0
给Java新手的一些建议——Java知识点归纳(Java基础部分)

  写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,...

Java工程师-10
2017/05/24
819
2

没有更多内容

加载失败,请刷新页面

加载更多

如何更改iOS应用程序的名称?

我前几天用一个愚蠢的开发代码名称开始了一个iPhone项目,现在我想改变项目的名称,因为它已经接近完成了。 但是我不知道如何使用Xcode来做这件事,尝试在info.plist文件中更改应用程序的名称...

技术盛宴
18分钟前
2
0
关于win10tensorflow的配置(CPU+GPU)

主要内容 CPU篇 GPU篇 【前期准备与注意事项】 环境:window1064位+python36(37)+CUDA9.0+cuDNN7.6+tensorflow_gpu-1.12.0 软件:anaconda+pycharm 硬件:有nvidia显卡的笔记本或台式(非A...

放只虎归个山
27分钟前
1
0
C#中的多行字符串文字

有没有一种简单的方法可以在C#中创建多行字符串文字? 这是我现在所拥有的: string query = "SELECT foo, bar"+ " FROM table"+ " WHERE id = 42"; 我知道PHP有 <<<BLOCKBLOCK; C#是......

javail
34分钟前
3
0
微信支付之小微商户扫盲!支持信用卡,免营业执照!

微信支付商户申请面向线下小微商户开放,符合条件的微信支付服务商可为小微商户发起接入申请。无需营业执照。 小微商户日收款额度为5万元~30万元 。 信用卡支付日限额为1千;月限额1万。 结算...

吴伟祥
今天
4
0
大话SDWebImage(三)-- 图片下载层

四、图片下载层 SDWebImageDownloader是处理图片下载的类 4.1 图片下载步骤 首先介绍下dispatch_barrier,GCD中的dispatch_barrier目的是在并发队列实现串行的效果,创建下载任务SDWebImageD...

aron1992
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部