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面试题-实现复杂链表的复制代码分享

    阿里终面在线编程题,写出来与大家分享一下 有一个单向链表,每个节点都包含一个random指针,指向本链表中的某个节点或者为空,写一个深度拷贝函数,拷贝整个链表,包括random指针.尽可能考虑可能的异常情况. 算法如下: /* public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.labe

  • Java实现单链表翻转实例代码

    Java实现单链表反转,递归和非递归两种形式 /** * 反转单链表 */ /** * 定义链表 * * @author 16026 * */ class Node { int val; Node next; public Node(int val) { this.val = val; } } public class ReverseList { /** * 反转链表 * * @param head * @return */ public static Node reverseList(Node

  • java 实现单链表逆转详解及实例代码

    java 实现单链表逆转详解 实例代码: class Node { Node next; String name; public Node(String name) { this.name = name; } /** * 打印结点 */ public void show() { Node temp = this; do { System.out.print(temp + "->"); temp = temp.next; }while(temp != null); System.o

  • 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中数组的定义及使用方法(推荐)

    数组:是一组相关变量的集合 数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组.二维数组.多维数组 数据的有点 不使用数组定义100个整形变量:int i1;int i2;int i3 使用数组定义 int i[100]; 数组定义:int i[100];只是一个伪代码,只是表示含义的 一维数组 一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的, 使用java数组,必须经过两个步骤,声明数组和分配内存给该数组, 声明形式一 声明一维数组:数据类型

  • Java中常用修饰符的使用方法汇总

    修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块. 类: 顶级类只能用public 修饰,顶级类不能使用private 和protected 修饰. 外部类可以被public修饰或者默认不写,不能用private和protected. 内部类可为静态,可用protected和private修饰. 方法: 通常方法可以被四个访问修饰符修饰,构造方法也可以被四个访问修饰符修饰. 抽象类中的抽象方法不能被private修饰,可以

  • 详解Java中接口的定义与实例代码

    Java中接口的定义详解 1.定义接口 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interface 接口名 [extends 父接口名列表]{ [public] [static] [final] 常量; [public] [abstract] 方法; } 修饰符:可选,用于指定接口的访问权限,可选值为public.如果省略则使用默认的访问权限. 接口名:必选参数,用于

  • java 中的封装介绍及使用方法

    java 中的封装介绍及使用方法 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问. 要访问该类的代码和数据,必须通过严格的接口控制. 封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段. 适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性. 封装的优点 1. 良好的封装能够减少耦合. 2. 类内部

  • Java接口的简单定义与实现方法示例

    本文实例讲述了Java接口的简单定义与实现方法.分享给大家供大家参考,具体如下: 1.接口是Java中最终要的概念,接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成. 2.接口的格式: interface interfaceName{ 全局常量 抽象方法 } 3.接口的实现也必须通过子类,使用关键字implements,而且接口是可以多实现的. 4.一个子类可以同时继承抽象类和实现接口. 5.一个接口不能继承一个抽象类,但是却可以通过extends关键字同时继承多个接口,实

  • 浅谈Java中hashCode的正确求值方法

    本文研究的主要是Java中hashCode的正确求值方法的相关内容,具体如下. 散列表有一项优化,可以将对象的散列码(hashCode)缓存起来,如果散列码不匹配,就不会检查对象的等同性而直接认为成不同的对象.如果散列码(hashCode)相等,才会检测对象是否相等(equals). 如果对象具有相同的散列码(hashCode),他们会被映射到同一个散列桶中.如果散列表中所有对象的散列码(hashCode)都一样,那么该散列表就会退化为链表(linked list),从而大大降低其查询效率. 一

  • java中常见的死锁以及解决方法代码

    在java中我们常常使用加锁机制来确保线程安全,但是如果过度使用加锁,则可能导致锁顺序死锁.同样,我们使用线程池和信号量来限制对资源的使用,但是这些被限制的行为可能会导致资源死锁.java应用程序无法从死锁中恢复过来,因此设计时一定要排序那些可能导致死锁出现的条件. 1.一个最简单的死锁案例 当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞.在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,那么这两个线程将永远地等待下去.这种就是最简答的死锁形式(

  • 详解JAVA中接口的定义和接口的实现

    1.接口的定义 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interface 接口名 [extends 父接口名列表]{ public static final 常量; public abstract 方法; } 修饰符:可选,用于指定接口的访问权限,可选值为public.如果省略则使用默认的访问权限. 接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标

  • Java中数组的定义和使用教程(二)

    数组与方法调用 数组是一个引用数据类型,那么所有的引用数据类型都可以为其设置多个栈内存指向.所以在进行数组操作的时候,也可以将其通过方法进行处理. 范例: 方法接受数组 public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {1, 2, 3}; printArray(data); } //定义一个专门进行数组输出的方法 public static void printArr

随机推荐