Java 链表的定义与简单实例

 Java 链表的定义与简单实例

Java实现链表主要依靠引用传递,引用可以理解为地址,链表的遍历多使用递归,这里我存在一个疑问同一个类的不同对象的的相同方法的方法内调用算不算递归.

这里我写的是单向链表;

package com.example.java;

public class MyLink {

public static void main(String [] args){ 

Link l=new Link();
  mytype[] la;
  mytype dsome=new mytype("韩敏","dsome",21);
  mytype shao=new mytype("邵晓","john",45);
  mytype hua=new mytype("华晓风","jam",46);
  mytype duo=new mytype("余小风","duo",1000);
  mytype wang=new mytype("王秋","jack",21);
  mytype shi=new mytype("韩寒","bob",3000);
  mytype yu=new mytype("于冬","keven",30); 

l.add(dsome);//测试增加节点
  l.add(shao);
  l.add(hua);
  l.add(wang);
  l.add(shi);
  l.add(duo);
  l.add(yu); 

  System.out.println("链表长度:"+l.length());//链表长度
  la=l.toArray();
  for(int i=0;i<la.length;i++){
 System.out.println(la[i].getInfo());
 } System.out.println("是否包含多余:"+l.contains(duo)+"\n");
  System.out.println("删除多余后\n");
  l.remove(duo);
  la=l.toArray();
  for(int i=0;i<la.length;i++){//转化为数组之后输出
   System.out.println(la[i].getInfo());
  }
System.out.println("\n利用索引方法输出全部数据");
  for(int i=0;i<l.length();i++){
   System.out.println(l.get(i).getInfo());
  }
System.out.println("是否包含多余:"+l.contains(duo)+"\n");
  l.clean();
  System.out.println("执行清空操作后链表长度: "+l.length()+"\t是否为空链表:"+l.isEmpty());
}
}
package com.example.java;
public class Link {

private class Node{//内部类
private Node next;
private mytype data;
public Node(mytype data){
   this.data=data;
 } 

public void addNode(Node newNode){//增加节点
   if(this.next==null){
    this.next=newNode;
   }else{
    this.next.addNode(newNode);
   }
  } 

  public mytype getNode(int index){//按照角标返回数据 

   if(index==Link.this.foot++){
    return this.data;
   }else{
    return this.next.getNode(index);
   }
  } 

  public boolean iscontain(mytype data){//判断是否含有该数据
   if(this.data.equals(data)){
    return true;
   }else{
    if(this.next!=null){
     return this.next.iscontain(data);
    }else{
     return false;
    }
   }
  } 

  public void removeNode(Node previous,mytype data){//删除节点
   if(this.data.equals(data)){
    previous.next=this.next; 

   }else{
    this.next.removeNode(this,data);
   }
  } 

  public void toArrayNode(){//转化数组
    Link.this.Larray[Link.this.foot ++]=this.data;
    if(this.next!=null){
     this.next.toArrayNode();
    }
   }
}
//内部类定义完毕
private Node root;
private int count=0;
private int foot;
private mytype [] Larray;

public void add(mytype data){//增加节点
  if(data==null){
   System.out.print("增加数据失败,数据为空");//测试用
   return;
  }
  Node newNode=new Node(data);
  if(this.root==null){
   this.root=newNode;
   this.count++;
  }else{
   this.root.addNode(newNode);
   this.count++;
  }
 } 

 public int length(){//链表长度
  return this.count;
 } 

 public boolean isEmpty(){//是否为空链表
  if(this.count==0)return true;
  else return false;
 } 

 public void clean(){//清空链表
  this.root=null;
  this.count=0;
 } 

 public mytype get(int index){//索引返回节点所存的数据
    if(index>=this.count||index<0){
     System.out.print("越界错误");//测试用
     return null;
    }else{
     this.foot=0;
     return this.root.getNode(index);
    }
   } 

   public boolean contains(mytype data){//判断链表数据是否含data
    if(data==null)
     return false;
    return this.root.iscontain(data);
   } 

   public void remove(mytype data){//删除指定数据节点
    if(this.contains(data)){
     if(this.root.data.equals(data)){
      this.root=this.root.next;
      this.count--;
     }
     else{
      this.count--;
      this.root.next.removeNode(root,data);
     }
    }else{
     System.out.print("删除错误");//测试用
    }
   } 

   public mytype[] toArray(){//把链表转化成对象数组
    if(this.count==0){
     return null;
    }
     this.foot=0;
     this.Larray=new mytype [this.count];
     this.root.toArrayNode();
     return this.Larray;
   }
}
package com.example.java;

public class mytype {

private String name;
private String people;
private int age;

public mytype(String name,String people,int age){//链表中的数据(可自定义)
  this.name=name;
  this.people=people;
  this.age=age;
 }
 public boolean equals(mytype data){//判断数据是否相同
  if(this==data){
   return true;
  }
  if(data==null){
   return false;
  }
  if(this.name.equals(data.name)&&this.people.equals(data.people)&&this.age==data.age){
   return true;
  }else{
   return false;
  }
 }
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public String getPeople() {
  return people;
}
public void setPeople(String people) {
  this.people = people;
}
public int getAge() {
  return age;
}
public void setAge(int age) {
  this.age = age;
} 

public String getInfo(){
  return "名字 :"+this.name+"\n"+
      "人物 :"+this.people+"\n"+
      "年龄 :"+this.age;
 }
}

测试效果如下:

链表长度:7
名字 :韩敏
人物 :dsome
年龄 :21
名字 :邵晓
人物 :john
年龄 :45
名字 :华晓风
人物 :jam
年龄 :46
名字 :王秋
人物 :jack
年龄 :21
名字 :韩寒
人物 :bob
年龄 :3000
名字 :余小风
人物 :duo
年龄 :1000
名字 :于冬
人物 :keven
年龄 :30
是否包含多余:true

删除多余后

名字 :韩敏
人物 :dsome
年龄 :21
名字 :邵晓
人物 :john
年龄 :45
名字 :华晓风
人物 :jam
年龄 :46
名字 :王秋
人物 :jack
年龄 :21
名字 :韩寒
人物 :bob
年龄 :3000
名字 :于冬
人物 :keven
年龄 :30

利用索引方法输出全部数据
名字 :韩敏
人物 :dsome
年龄 :21
名字 :邵晓
人物 :john
年龄 :45
名字 :华晓风
人物 :jam
年龄 :46
名字 :王秋
人物 :jack
年龄 :21
名字 :韩寒
人物 :bob
年龄 :3000
名字 :于冬
人物 :keven
年龄 :30
是否包含多余:false

执行清空操作后链表长度: 0 是否为空链表:true
(0)

相关推荐

  • Java中双向链表详解及实例

    Java中双向链表详解及实例 写在前面: 双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每一个节点即可向前引用,也可向后引用,这样可以更方便的插入.删除数据元素. 由于双向链表需要同时维护两个方向的指针,因此添加节点.删除节点时指针维护成本更大:但双向链表具有两个方向的指针,因此可以向两个方向搜索节点,因此双向链表在搜索节点.删除指定索引处节点时具有较好的性能. Java语言实现双向链表: package com.ietree.basic.datastructure.dublin

  • java 中链表的定义与使用方法

    java 中链表的定义与使用方法 Java实现链表主要依靠引用传递,引用可以理解为地址,链表的遍历多使用递归,这里我存在一个疑问同一个类的不同对象的的相同方法的方法内调用算不算递归. 这里我写的是单向链表; 实例代码: package com.example.java; public class MyLink { public static void main(String [] args){ Link l=new Link(); mytype[] la; mytype dsome=new my

  • Java单链表基本操作的实现

    最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提宝贵

  • JAVA实现链表面试题

    这份笔记整理了整整一个星期,每一行代码都是自己默写完成,并测试运行成功,同时也回顾了一下<剑指offer>这本书中和链表有关的讲解,希望对笔试和面试有所帮助. 本文包含链表的以下内容: 1.单链表的创建和遍历 2.求单链表中节点的个数 3.查找单链表中的倒数第k个结点(剑指offer,题15) 4.查找单链表中的中间结点 5.合并两个有序的单链表,合并之后的链表依然有序[出现频率高](剑指offer,题17) 6.单链表的反转[出现频率最高](剑指offer,题16) 7.从尾到头打印单链表(

  • 详解java数据结构与算法之双链表设计与实现

    在单链表分析中,我们可以知道每个结点只有一个指向后继结点的next域,倘若此时已知当前结点p,需要查找其前驱结点,那么就必须从head头指针遍历至p的前驱结点,操作的效率很低,因此如果p有一个指向前驱结点的next域,那效率就高多了,对于这种一个结点中分别包含了前驱结点域pre和后继结点域next的链表,称之为双链表.本篇我们将从以下结点来分析双链表 双链表的设计与实现 双链表的主要优点是对于任意给的结点,都可以很轻易的获取其前驱结点或者后继结点,而主要缺点是每个结点需要添加额外的next域,因

  • JAVA 数据结构链表操作循环链表

    JAVA 链表操作:循环链表 主要分析示例: 一.单链表循环链表 二.双链表循环链表 其中单链表节点和双链表节点类和接口ICommOperate<T>与上篇一致,这里不在赘述.参考:JAVA链表操作:单链表和双链表http://www.jb51.net/article/95113.htm 一.单链表循环链表 package LinkListTest; import java.util.HashMap; import java.util.Map; public class SingleCycle

  • java 实现双向链表实例详解

    java 实现双向链表实例详解 双向链表是一个基本的数据结构,在Java中LinkedList已经实现了这种结构,不过作为开发者,也要拥有自己显示这种结构的能力.话不多说,上代码:     首先是链表的节点类: /** * 链表节点 * @author Administrator * * @param <T> */ public class ChainNode<T> { private T data; //对象编号 private int dataNo; public ChainN

  • Java 数据结构链表操作实现代码

    链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表.循环链表.双向链表,下面将逐一介绍.链表在数据结构中是基础,也是重要的知识点,这里讲下Java 中链表的实现, JAVA 链表操作:单链表和双链表 主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个链

  • Java 链表的定义与简单实例

     Java 链表的定义与简单实例 Java实现链表主要依靠引用传递,引用可以理解为地址,链表的遍历多使用递归,这里我存在一个疑问同一个类的不同对象的的相同方法的方法内调用算不算递归. 这里我写的是单向链表; package com.example.java; public class MyLink { public static void main(String [] args){ Link l=new Link(); mytype[] la; mytype dsome=new mytype("

  • Java 实现随机验证码功能简单实例

    Java 实现随机验证码功能简单实例 现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 在这里,我们使用servlet来实现随机验证码的实现.  实现代码: p

  • JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖性  可以通过注解替代配置文件,简化项目的配置.现有的许多框架都采用这个功能减少自己的配置. 编译检查  在编译时进行格式检查,例如@Override 基础注解 Java目前内置了三种标准注解,以及四种元注解.四种元注解负责创建其他的注解. 三种标准注解 @Override,表示当前的方法覆盖超类中

  • java去除重复对象的简单实例

    实例如下: import java.util.*; class Person { private String name; private int age; Person(String name,int age){ this.name=name; this.age=age; } public boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p=(Person)obj; return thi

  • Java web的读取Excel简单实例代码

    目录结构: Data.xls数据: 后台页面: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println(this.getServletContext().getRealPath ("/")); try{ Workbook wb = Workbook.getWorkbook(

  • Java IO 之文件读写简单实例

    Java IO 之文件读写简单实例 1.文件读 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字

  • Java 实现 web服务器的简单实例

    Java 实现 web服务器的简单实例 实例代码: import java.util.*; // Chapter 8, Listing 3 public class WebServerDemo { // Directory of HTML pages and other files protected String docroot; // Port number of web server protected int port; // Socket for the web server prot

  • Java持久层框架MyBatis简单实例

    什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO). MyBatis 本是apache的一个开源项目iB

  • java 使用HttpURLConnection发送数据简单实例

    java 使用HttpURLConnection发送数据简单实例 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响.如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字.JAVA使用HttpURLCon

  • Java生产1-100的随机数简单实例(分享)

    直接调用Math里面的random即可,简单方便 int i = (int)(Math.random()*100+1); 以上这篇Java生产1-100的随机数简单实例(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐