java 实现双向链表实例详解

双向链表是一个基本的数据结构,在Java中LinkedList已经实现了这种结构,不过作为开发者,也要拥有自己显示这种结构的能力。话不多说,上代码:
首先是链表的节点类:
/**
* 链表节点
* @author Administrator
*
* @param <T>
*/
public class ChainNode<T> {
private T data;
//对象编号
private int dataNo;
public ChainNode<T> nextChainNode;
public ChainNode<T> preChainNode;
public ChainNode(T data, ChainNode<T> nextChainNode,
ChainNode<T> preChainNode) {
this.data = data;
this.nextChainNode = nextChainNode;
this.preChainNode = preChainNode;
}
public ChainNode(T data) {
this.data = data;
}
public int getDataNo() {
return dataNo;
}
public void setDataNo(int dataNo) {
this.dataNo = dataNo;
}
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
然后是链表:
<pre name="code" class="java">/**
* 链表实现类
* @author Administrator
*
* @param <T>
*/
public class Chain<T> {
//头节点
private ChainNode<T> headNode;
//末尾节点指针
private ChainNode<T> lastNode;
private int size;
//创建链表就创建头节点
public Chain() {
this.headNode = new ChainNode<T>(null);
this.lastNode = headNode;
}
//增加一个节点
public void addNode(T data) {
ChainNode<T> node = new ChainNode<T>(data);
if(lastNode != null){
lastNode.nextChainNode = node;
node.preChainNode = node;
node.setDataNo(size);
lastNode = node;
size++;
}
}
//删除指定索引的节点
public void deleteNode(int dataNo) throws Exception {
if(getSize() == 0){
throw new Exception("chain is empty");
}
for (ChainNode<T> node = headNode.nextChainNode;node != null;node = node.nextChainNode) {
if(node.getDataNo() == dataNo){
node.preChainNode.nextChainNode = node.nextChainNode;
if(node.nextChainNode != null){
node.nextChainNode.preChainNode = node.preChainNode;
}
node.nextChainNode = null;
node.preChainNode = null;
size--;
//重新设置节点的编号
for (ChainNode<T> chainNode = node.nextChainNode;chainNode != null;chainNode = chainNode.nextChainNode) {
chainNode.setDataNo(chainNode.getDataNo()-1);
}
return;
}
}
throw new Exception("the corresponding data that can not be found");
}
//获取指定索引的节点
public T get(int dataNo) throws Exception {
if(getSize() == 0){
throw new Exception("chain is empty");
}
for (ChainNode<T> node = headNode.nextChainNode;node != null;node = node.nextChainNode) {
if(node.getDataNo() == dataNo){
return node.getData();
}
}
throw new Exception("the corresponding data that can not be found");
}
//修改对应索引的节点
public void set(int dataNo,T data) throws Exception {
if(getSize() == 0){
throw new Exception("chain is empty");
}
for (ChainNode<T> node = headNode.nextChainNode;node != null;node = node.nextChainNode) {
if(node.getDataNo() == dataNo){
node.setData(data);
return;
}
}
throw new Exception("the data that is to be modified can not be found");
}
//是否包含对应数据的节点
public boolean isContains(T data) throws Exception {
if(getSize() == 0){
throw new Exception("chain is empty");
}
for (ChainNode<T> chainNode = headNode.nextChainNode;chainNode != null;chainNode = chainNode.nextChainNode) {
if(chainNode.getData() == data){
return true;
}
}
return false;
}
//获取节点数量(不含头节点)
public int getSize() {
return size;
}
}
测试一下:
public class ChainTest {
public static void main(String[] args) throws Exception{
String oneString = "one";
String twoString = "two";
String threeString = "three";
String fourString = "four";
Chain<String> chain = new Chain<String>();
chain.addNode(oneString);
chain.addNode(twoString);
chain.addNode(threeString);
chain.addNode(fourString);
for (int i = 0; i < chain.getSize(); i++) {
String string2 = chain.get(i);
System.out.println(string2);
}
try {
String string = chain.get(2);
System.out.println("the data of the second node is"+string);
System.out.println(chain.isContains(fourString));
chain.set(1, "haha");
System.out.println("modify chain");
for (int i = 0; i < chain.getSize(); i++) {
String string2 = chain.get(i);
System.out.println(string2);
}
chain.deleteNode(3);
System.out.println("delete one node");
for (int i = 0; i < chain.getSize(); i++) {
String string2 = chain.get(i);
System.out.println(string2);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:
one two three four the data of the second node isthree true modify chain one haha three four delete one node one haha three
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java双向链
# java双向链详解
# java双向链实例
# java数据结构之实现双向链表的示例
# Java中双向链表详解及实例
# Java实现双向链表(两个版本)
# Java语言中链表和双向链表
# JAVA实现双向链表的增删功能的方法
# java中使用双向链表实现贪吃蛇程序源码分享
# java实现单链表、双向链表
# Java双向链表按照顺序添加节点的方法实例
# java数据结构基础:单链表与双向链表
# 基于Java实现双向链表
# 链表
# 是一个
# 也要
# 数据结构
# 希望能
# 不含
# 谢谢大家
# 多说
# 测试一下
# 实现了
# nextChainNode
# dataNo
# getDataNo
# preChainNode
# size
# getData
# int
# data
# headNode
# lastNode
相关文章:
打鱼网站制作软件,波克捕鱼官方号怎么注册?
广州商城建站系统开发成本与周期如何控制?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Swift中switch语句区间和元组模式匹配
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
怎么将XML数据可视化 D3.js加载XML
如何在建站之星绑定自定义域名?
建站上传速度慢?如何优化加速网站加载效率?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
网站制作企业,网站的banner和导航栏是指什么?
内部网站制作流程,如何建立公司内部网站?
如何通过虚拟机搭建网站?详细步骤解析
制作宣传网站的软件,小红书可以宣传网站吗?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
教程网站设计制作软件,怎么创建自己的一个网站?
兔展官网 在线制作,怎样制作微信请帖?
制作网站公司那家好,网络公司是做什么的?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
建站之家VIP精选网站模板与SEO优化教程整合指南
网站制作知乎推荐,想做自己的网站用什么工具比较好?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
建站ABC备案流程中有哪些关键注意事项?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
如何通过VPS搭建网站快速盈利?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
历史网站制作软件,华为如何找回被删除的网站?
如何在香港服务器上快速搭建免备案网站?
IOS倒计时设置UIButton标题title的抖动问题
建站为何优先选择香港服务器?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
油猴 教程,油猴搜脚本为什么会网页无法显示?
建站之星免费模板:自助建站系统与智能响应式一键生成
如何批量查询域名的建站时间记录?
建站之星备案流程有哪些注意事项?
在线教育网站制作平台,山西立德教育官网?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何通过服务器快速搭建网站?完整步骤解析
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
北京网站制作公司哪家好一点,北京租房网站有哪些?
免费视频制作网站,更新又快又好的免费电影网站?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
建站主机空间推荐 高性价比配置与快速部署方案解析
如何获取PHP WAP自助建站系统源码?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
制作公司内部网站有哪些,内网如何建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。