1.实现链表的步骤

  • 1).实现Node节点类(用来保存链表中每个节点的数据,以及下一个节点成员)
  • 2).实现LinkList链表类(用来封装Node节点类,和用户实现交互)
  • 3).在LinkList类里,实现添加,删除,根据要查的Node数据来找表中的序号,根据要查的序号来找对应的Node数据.
  • 4).在LinkList类里,实现toArrays方法,用来取出链表中的Node数据的数组

2.类的实现

/*节点类*/
class Node
{
private String data; //节点保存的数据
private Node next; //下个节点 public Node(String data){
this.data = data;
} public String getData()
{
return data;
}
public void setData(String data)
{
this.data = data;
} public Node getNext()
{
return next;
}
public void setNext(String data)
{
this.next = new Node(data);
} /*Description: 添加节点
*return :
*/
public void addNode(String data)
{
if(getNext()!=null)
{
this.next.addNode(data);
}
else
{
this.setNext(data);
}
} /*Description: 获取节点数据
*return :
*/
public String getData(int index)
{
String ret =null ;
if(index == 0) //如果递归到0,则返回当前数据
{
ret=data;
}
else //否则继续递归查找
{
ret=this.next.getData(--index);
}
return ret;
} /*Description: 递归地查找data位于链表哪个序号
*return : -1(表示未找到)
*/
public int findIndex(String data,int index)
{
if(this.data.equals(data)) //已找到
{
return index;
}
else if (getNext()==null) //未找到
{
return -1;
} return this.next.findIndex(data,++index); } /*Description: 递归地查找data,并删除
*data: 要找的data
*PreNode: 上个节点,如果为null则当前位于表头
*index: 表示当前位于链表哪个序号
*return : -1(表示未找到) 0~(len-1) (表示data位于链表哪个序号)
*/
public int delData(String data,Node PreNode,int index)
{
int ret = -1; if(this.data.equals(data)) //删除
{
PreNode.next = this.next;
return index;
}
else if (getNext()==null) //未找到
{
return ret;
} return this.next.delData(data,this,++index);
} } /*链表类*/
class LinkList
{
private Node next; //负责管理的节点
private int len; //统计节点长度 public LinkList(String data)
{
next = new Node(data);
len =1;
} /*Description: 添加一个节点数据
*return :
*/
public void addData(String data)
{
this.next.addNode(data);
len++;
} /*Description: 删除一个节点数据
*return : -1(未找到要删除的数据) 0~(len-1) (表示data位于链表哪个序号)
*/
public int delData(String data)
{
int ret=-1;
if(len>=0) //链表有数据
{
if(this.next.getData().equals(data)) //删除表头需要特殊处理
{
this.next = this.next.getNext();
ret = 0;
}
else
ret = next.delData(data,this.next,1);
} if(ret!= -1) //已删除
{
len--;
} return ret;
} /*Description: 根据index找到对应的节点数据
*return : 返回节点数据
*/
public String getNodeData(int index)
{
String ret=null;
if(index>=0 && index<(len))
{
ret = next.getData(index);
}
return ret;
} /*Description: 根据data查找节点Node位于链表哪个序号
*return : -1(表示未找到) 0~(len-1) (表示data位于链表哪个序号)
*/
public int findNodeIndex(String data)
{
int ret=-1;
if(len>=0) //链表有数据
{
ret = next.findIndex(data,0); //从序号0开始找
}
return ret;
} /*Description: 将链表中所有的节点数据转为数组
*return :
*/
public String[] toArrays()
{
Node tmp=this.next; String[] arr = new String[len]; for(int i=0; i< len; i++)
{
arr[i] = tmp.getData();
tmp = tmp.getNext();
}
return arr;
} public int length()
{
return len;
}
}

3.测试代码

public class Test{
public static void main(String args[]){
LinkList list = new LinkList("小A"); //添加节点数据
list.addData("小B");
list.addData("小C");
list.addData("小D");
list.addData("小E"); //打印节点数据
System.out.println("print Node data:");
for(int i=0;i<list.length();i++)
{
System.out.println(list.getNodeData(i));
}
System.out.println("---------------------"); //查找节点数据的序号
System.out.println("小A的index位于:"+list.findNodeIndex("小A"));
System.out.println("小D的index位于:"+list.findNodeIndex("小D"));
System.out.println("小F的index位于:"+list.findNodeIndex("小F")); //返回-1,表示未找到 //删除节点数据
System.out.println("删除小A,并打印小A之前的位置:"+list.delData("小A"));
System.out.println("删除小E,并打印小E之前的位置:"+list.delData("小E"));
//通过数组打印数据
System.out.println("\r\nprint Node data by toArrays() :");
String[] arr=list.toArrays();
for(int i=0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
System.out.println("---------------------");
}
}

运行打印:

PS:这样写,只是简单的实现某个数据类型的链表.在后面我们学习了JAVA-Object类,由于Object类是所有类的超类,所以,我们可以来实现满足所有类型的链表

接下来开始重新修改链表.

4.修改链表-将节点数据改为Object类型

class Node
{
private Object data; //节点保存的数据
private Node next; //下个节点 public Node(Object data){
this.data = data;
} public Object getData() //获取数据
{
return data;
}
public void setData(Object data)
{
this.data = data;
} public Node getNext()
{
return next;
}
public void setNext(Object data)
{
this.next = new Node(data);
} /*Description: 添加节点
*return :
*/
public void addNode(Object data)
{
if(getNext()!=null)
{
this.next.addNode(data);
}
else
{
this.setNext(data);
}
} /*Description: 获取节点数据
*return :
*/
public Object getData(int index)
{
Object ret =null ;
if(index == 0) //如果递归到0,则返回当前数据
{
ret=data;
}
else //否则继续递归查找
{
ret=this.next.getData(--index);
}
return ret;
} /*Description: 递归地查找data位于链表哪个序号
*return : -1(表示未找到)
*/
public int findIndex(Object data,int index)
{
if(this.data.equals(data)) //已找到
{
return index;
}
else if (getNext()==null) //未找到
{
return -1;
} return this.next.findIndex(data,++index); } /*Description: 递归地查找data,并删除
*data: 要找的data
*PreNode: 上个节点,如果为null则当前位于表头
*index: 表示当前位于链表哪个序号
*return : -1(表示未找到) 0~(len-1) (表示data位于链表哪个序号)
*/
public int delData(Object data,Node PreNode,int index)
{
int ret = -1; if(this.data.equals(data)) //删除
{
PreNode.next = this.next;
return index;
}
else if (getNext()==null) //未找到
{
return ret;
} return this.next.delData(data,this,++index);
} } /*链表类*/
class LinkList
{
private Node next; //负责管理的节点
private int len; //统计节点长度 public LinkList(Object data)
{
next = new Node(data);
len =1;
} /*Description: 添加一个节点数据
*return :
*/
public void addData(Object data)
{
this.next.addNode(data);
len++;
} /*Description: 删除一个节点数据
*return : -1(未找到要删除的数据) 0~(len-1) (表示data位于链表哪个序号)
*/
public int delData(Object data)
{
int ret=-1;
if(len>=0) //链表有数据
{
if(this.next.getData().equals(data)) //删除表头需要特殊处理
{
this.next = this.next.getNext();
ret = 0;
}
else
ret = next.delData(data,this.next,1);
} if(ret!= -1) //已删除
{
len--;
} return ret;
} /*Description: 根据index找到对应的节点数据
*return : 返回节点数据
*/
public Object getNodeData(int index)
{
Object ret=null;
if(index>=0 && index<(len))
{
ret = next.getData(index);
}
return ret;
} /*Description: 根据data查找节点Node位于链表哪个序号
*return : -1(表示未找到) 0~(len-1) (表示data位于链表哪个序号)
*/
public int findNodeIndex(Object data)
{
int ret=-1;
if(len>=0) //链表有数据
{
ret = next.findIndex(data,0); //从序号0开始找
}
return ret;
} /*Description: 将链表中所有的节点数据转为数组
*return :
*/
public String[] toArrays()
{
Node tmp=this.next; String[] arr = new String[len]; for(int i=0; i< len; i++)
{
arr[i] = tmp.getData().toString();
tmp = tmp.getNext();
}
return arr;
} public int length()
{
return len;
}
}

5.测试修改后的链表

接下来,我们便来写一个student学生类,然后通过我们修改后的链表来保存该类

5.1 student学生类如下所示:

/*学生类*/
class Student
{
String name; //名字
String clas; //班级
int score; //成绩 Student(String name,String clas,int score)
{
this.name = name;
this.clas = clas;
this.score = score;
}
/*覆写Object类的equals方法*/
public boolean equals(Object obj)
{
if(obj == null) //地址为null
return false; if(obj instanceof Student == false) //非本类
{
System.out.println("ERR");
return false;
} if(this == obj) //地址相同
return true; Student st = (Student)obj; if(this.name.equals(st.name) &&
this.clas.equals(st.clas) &&
this.score == st.score )
return true; return false;
} /*覆写Object类的toString方法*/
public String toString()
{
return "姓名:"+name+" 班级:"+clas+" 成绩:"+score;
}
}

5.2 student学生类的测试代码如下所示:

    Student xiaoA  = new Student("小A","初1-6班",77);
Student xiaoB = new Student("小B","初2-1班",99);
Student xiaoC = new Student("小C","初1-2班",66);
Student xiaoD = new Student("小D","初2-2班",49);
Student xiaoE = new Student("小E","初2-3班",88);
Student xiaoF = new Student("小F","初2-3班",89); //创建链表,并添加 xiaoA 链表节点
LinkList list = new LinkList(xiaoA); //继续添加节点数据
list.addData(xiaoB);
list.addData(xiaoC);
list.addData(xiaoD);
list.addData(xiaoE); //打印节点数据
System.out.println("print Node data:");
for(int i=0;i<list.length();i++)
{
System.out.println(list.getNodeData(i));
}
System.out.println("---------------------"); //查找节点数据的序号
System.out.println("小A的index位于:"+list.findNodeIndex(xiaoA));
System.out.println("小D的index位于:"+list.findNodeIndex(xiaoD));
System.out.println("小F的index位于:"+list.findNodeIndex(xiaoF)); //返回-1,表示未找到 //删除节点数据
System.out.println("删除小A,并打印小A之前的位置:"+list.delData(xiaoA));
System.out.println("删除小E,并打印小E之前的位置:"+list.delData(xiaoE));
//通过数组打印数据
System.out.println("\r\nprint Node data by toArrays() :");
String[] arr=list.toArrays();
for(int i=0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
System.out.println("---------------------");

5.3 打印如下:

下章学习: 7.JAVA-类继承、覆写、final关键字

6.JAVA-链表实例的更多相关文章

  1. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  2. JAVA RMI 实例

    下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用. 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承Unicas ...

  3. Java多线程-实例解析

    Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...

  4. Thrift入门初探--thrift安装及java入门实例

    什么是thrift? 简单来说,是Facebook公布的一款开源跨语言的RPC框架. 那么问题来了. 什么是RPC框架? RPC全称为Remote Procedure Call,意为远程过程调用. 假 ...

  5. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  6. JAVA链表中迭代器的实现

    注:本文代码出自<java数据结构和算法>一书. PS:本文中类的名字定义存在问题,Link9应改为Link.LinkList9应该为LinkList.由于在同包下存在该名称,所以在后面接 ...

  7. [Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  8. 【thrift】thrift入门初探--thrift安装及java入门实例

    转载:https://www.cnblogs.com/fingerboy/p/6424248.html 公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门 ...

  9. Redis缓存Mysql模拟用户登录Java实现实例[www]

    Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...

  10. Flex Socket与Java通信实例说明(转)

    Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...

随机推荐

  1. mybatis逆向工程的注意事项,以及数据库表

    1.选择性更新,如果有新参数就更换成新参数,如果参数是null就不更新,还是原来的参数 2.mybatis使用逆向工程,数据库建表的字段user_id必须用下滑线隔开,这样生成的对象private L ...

  2. Pyinstaller (python打包为exe文件)

    需求分析: python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件,降低脚本对环境的依赖性,同时运行更加迅速. 当然打包的脚本似乎不是在所有的win平台下都能使用,wi ...

  3. 上传文件格式,及headers设置

    file[]:(binary)文件格式,传过去的参数自然是query string parameters  形式,当然也有纯的formData格式 formData格式就是将所有的参数append到p ...

  4. 报错Domain=NSCocoaErrorDomain Code=3840 "Garbage at end."

    网络请求出现报错:Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." 出现的问题是后台返回了两次json数据!

  5. Three.js学习笔记04--纹理

    1 纹理由图片组成  3D世界的纹理由图片组成. 将纹理以一定的规则映射到几何体上,一般是三角形上,那么这个几何体就有纹理皮肤了. 首先应该有一个纹理类,其次是有一个加载图片的方法,将这张图片和这个纹 ...

  6. JDK 8 之 Stream sorted() 示例

    原文链接:http://www.concretepage.com/java/jdk-8/java-8-stream-sorted-example 国外对Java8一系列总结的不错, 翻译过来给大家共享 ...

  7. [Swift]LeetCode299. 猜数字游戏 | Bulls and Cows

    You are playing the following Bulls and Cows game with your friend: You write down a number and ask ...

  8. [Swift]LeetCode409. 最长回文串 | Longest Palindrome

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

  9. Redis 设计与实现 (七)--事务

    事务 *ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability) redi ...

  10. [BASH]获取执行脚本的路径

    SCRIPT=$(readlink -f "$0") #当前执行脚本的真实路径,兼容软链接 basedir=$(dirname "$SCRIPT") #当前执行 ...