6.JAVA-链表实例
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;}elseret = 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;}elseret = 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) //地址为nullreturn 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-链表实例相关推荐
- Java经典实例代码
Java经典实例(第二版) 1. 获取环境变量 Java代码 1. System.getenv("PATH"); 2. System.getenv("J ...
- Java Websocket实例【服务端与客户端实现全双工通讯】
Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...
- java 报文请求_http 请求报文和响应报文编写 (java socket实例)
http 请求头由三部分组成:请求行.请求头部.请求体 GET / HTTP/1.1\r\n Host: 114.55.40.20\r\n Content-Type: text/html;charse ...
- java控制语句练习题_[Java初探实例篇02]__流程控制语句知识相关的实例练习
本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...
- [转载 整理]C语言链表实例
C语言链表有单链表.双向链表.循环链表.单链表由数据域和指针域组成,数据域存放数据,指针域存放该数据类型的指针便于找到下一个节点.双链表则含有头指针域.数据域和尾指针域,域单链表不同,双链表可以从后一 ...
- MapReduce Java API实例-排序
场景 MapReduce Java API实例-统计单词出现频率: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11941016 ...
- MapReduce Java API实例-统计平均成绩
场景 MapReduce Java API实例-统计单词出现频率: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11941016 ...
- MapReduce Java API实例-统计出现过的单词
场景 MapReduce Java API实例-统计单词出现频率: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11941016 ...
- JAVA正则表达式实例教程(转帖收藏)
So many open source projects. Why not Open your Documents? 1 JAVA正则表达式实例教程 12/11/2008 1.正则表达式的知识要点 1 ...
- 判断Java 对象实例是否死亡
垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进入主题之前,我们要先 ...
最新文章
- esxi宿主机的本地存储-非活动
- ipython notebook主题背景颜色更改
- 强化学习(四)—— DQN系列(DQN, Nature DQN, DDQN, Dueling DQN等)
- 第十七单元 Samba服务
- 疯狂ios讲义之网页控件(UIWebView)
- 寄售业务的SAP标准流程
- JZOJ 5475. 【NOIP2017提高组正式赛】逛公园
- Windows之Wireshake之抓HTTP请求包(过滤目的IP)
- nodemailer 附件_如何使用Nodemailer发送带有附件的电子邮件。 Node.js
- 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
- Android8.1展讯平台之audio_policy_configuration.xml(四十二)
- Git——版本回退【git reset / git log / git reflog】
- 440.字典序中的第K小数字
- 无名小站超雅虎奇摩成台湾第一大网站
- Azure云平台 GPS大数据解决方案 EventHub+Azure Databricks+Azure Cosmos DB Cassandra
- 批量文件转码工具(支持GBK,UTF-8转换)
- 一篇关于数学建模美赛论文撰写的心得
- 2022-XTU程设练习1
- js判断APP和浏览器
- 华为小艺输入法测试版 1.0.19.103 发布
热门文章
- Linux安装realvnc-vnc-server
- 洛谷 P2345 奶牛集会 解题报告
- dedecms切换模板css,dedecms更换模板教程
- 【干货分享】Win8系统连接蓝牙耳机声音低或者音质低高效解决办法!!!
- h5 跳转小程序微信浏览器不显示跳转按钮
- 105.【Docker】
- vs2010 中文版下载地址及可用CDKEY(转自:http://www.ljf.cn/archives/79.aspx)
- Django 省、市、区 三级联动 及数据库的地址添加 !!!
- 一个简单的游戏性能测试用例
- androidstudio 启动苹果模拟器 启动flutter项目