直接上代码

//节点
class HeroNodeD{
int no;
String name;
String nickName;
HeroNodeD pre;//前一节点
HeroNodeD next;//后一节点 public HeroNodeD(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
} @Override
public String toString() {
return "HeroNodeD{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}

双向链表:

//双向链表
class DoublleLinkList{
public HeroNodeD head = new HeroNodeD(0,"",""); public void setHead(HeroNodeD head) {
this.head = head;
} //0, 获取头结点
public HeroNodeD getHead(){
return head;
}
//1, 获取尾结点
public HeroNodeD getLastNode(){
HeroNodeD temp = head;
while(true){
if(temp.next == null){
break;//尾节点
}
temp = temp.next;
}
return temp;
}
//2, 添加(添加节点到链表的最后面)
public void add(HeroNodeD node){
HeroNodeD temp = head;
while(true){
if(temp.next == null){
break;//尾节点
}
temp = temp.next;
}
//循环结束后,此时temp就是尾节点
temp.next = node;
node.pre = temp;
}
//3, 添加(根据节点的no(排名)的大小, 有序添加)
public void addByNo(HeroNodeD node){
HeroNodeD temp = head;
while (true) {
if(temp.next == null){
break;//链表尾部就跳出
}
if(temp.next.no > node.no){
break;
}
temp = temp.next;
}
//循环结束, 说明temp的下一节点, 就是node的插入位置
node.next = temp.next;//设置node和 temp.next的后节点
temp.next.pre = node;//设置node和 temp.next的 前节点 node.pre = temp;//设置temp 和 node的 前节点
temp.next = node;//设置temp 和 node的 后节点
}
//4, 双向链表的 遍历,从前向后遍历
public void showBeginToEnd(){
HeroNodeD temp = head;
while(true){
if(temp.next == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
System.out.println(temp);
}
//5:从后向前遍历
public void showEndToBegin(){
//获取尾节点
HeroNodeD temp = getLastNode();
while(true){
if(temp.pre == null){
break;
}
System.out.println(temp);
temp = temp.pre;
}
System.out.println(temp);
}
//6, 链表的长度// 头节点不计入长度
public int length(){
HeroNodeD temp = head;
int count=0;
while(true){
if(temp.next == null){
break;
}
count++;
temp = temp.next;
}
return count;
}
//7, 删除第n个节点
public void delNode(int n){
int count = 0;
boolean flag = false;
HeroNodeD temp = head.next;
while (temp != null) {
count++;
if (count == n) {
flag = true;
break;
}
temp = temp.next;
}
if(flag){
//跳出循环,说明找到这个节点, 删除该节点
temp.pre.next = temp.next;
temp.next.pre = temp.pre;
}else{
System.out.println("不存在这个节点");
} }
//8, 更改某个节点
public void updateNode(int n, HeroNodeD node){
boolean flag = false;
int count = 0;
HeroNodeD temp = head.next;
while (temp != null) {
if(temp.next == null){
break;
}
count++;
if(count == n){
flag = true;
break;
}
temp = temp.next;
} if(flag){
//更换这个节点
temp.pre.next = node;
node.pre = temp.pre; node.next = temp.next;
temp.next.pre = node;
}else{
System.out.println("不存在这个节点");
}
}
}

测试代码:

    public static void main(String[] args){
DoublleLinkList doublelink = new DoublleLinkList();
HeroNodeD node1 = new HeroNodeD(1, "宋江", "及时雨");
HeroNodeD node2 = new HeroNodeD(2, "吴用", "神算子");
HeroNodeD node3 = new HeroNodeD(3, "卢俊义", "玉麒麟");
HeroNodeD node4 = new HeroNodeD(4, "武松", "打老虎");
HeroNodeD node5 = new HeroNodeD(5, "吕财", "打老虎"); doublelink.add(node1);
doublelink.add(node3);
doublelink.addByNo(node2);//有序添加 doublelink.showBeginToEnd();//1-2-3
System.out.println("==========================");
doublelink.showEndToBegin();//3-2-1
System.out.println(doublelink.length());//长度为3 doublelink.delNode(4);//没有这个节点
doublelink.showBeginToEnd();
System.out.println("==========");
doublelink.updateNode(2,node5);//更换第二个节点
doublelink.showBeginToEnd();
}

测试结果:

4,java数据结构和算法:双向链表 ,有序添加,正向遍历,反向遍历, 增删改查的更多相关文章

  1. Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)

    接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1.首先项目图: 2.这里的布局文件activity_main.xml: <LinearLayout xmlns:android ...

  2. java桥连接sql server之登录验证及对数据库增删改查

    一:步骤 1.sql server建立数据库和相关表 2.建立数据源  (1).打开控制面板找到管理,打开ODBC选项或直接搜索数据源  (2).打开数据源配置后点击添加,选择sql server点击 ...

  3. eclipse添加插件实现php的增删改查

    一:eclipse添加php插件 1.运行eclipse,在主界面里找到Help下的“Instal New Software”.然后在Work with中选择“All Available Sites” ...

  4. Android(java)学习笔记136:利用谷歌API对数据库增删改查(推荐使用)

    接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1. 首先项目图: 2. 这里的布局文件activity_main.xml: <LinearLayout xmlns:andro ...

  5. Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作

    必须的准备工作 一.MySQL的安装.可以参考博文: http://blog.csdn.net/jueblog/article/details/9499245 二.下载 jdbc 驱动.可以从在官网上 ...

  6. java程序设计课期中考试——数据库的增删改查和简单的js界面

    首先是设计思路,对于数据库的增删改查,我们借助Ecilipse来进行前端和后端的编写.Ecilipse是可以进行java web项目的操作的. 前端,我们选择用使用jsp,所谓的jsp就是可以嵌入其他 ...

  7. MongoDB(六)java操作mongodb增删改查

    java操作mysql数据库的代码我们已经了如指掌了.增删改查,java对mongodb数据库也是类似的操作,先是数据库连接.再是进行操作. 首先我们进入进入admin数据库.然后建立自己的数据库te ...

  8. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

  9. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  10. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

随机推荐

  1. Linux中的DHCP服务

    目录 DHCP DHCP的报文类型 DHCP的部署 DHCP中继(DHCP代理) DHCP DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局 ...

  2. POJ1486模拟或者匈牙利变种

    题意:       有n个矩形,每个矩形上的某个位置上都有一个点,但是由于矩形是透明的,当一些矩形重叠在一起的时候就很可能分不清哪个点是那个矩形的,给你n个矩形的坐标,还有n个点的坐标,然后让你找出所 ...

  3. CVE-2018-8174(双杀漏洞)复现

    目录 CVE-2018-8174双杀漏洞复现一(不稳定) 下载payload MSF监听 CVE-2018-8174双杀漏洞复现二

  4. Windows 怎么知道我已经连接到互联网而不是局域网? 原来当中大有文章!

    Windows 怎么知道我已经连接到互联网而不是局域网? 原来当中大有文章! 转载 原文章地址:点击 2014-01-09 Windows 怎么知道我已经连接到互联网而不是局域网? 原来当中大有文章! ...

  5. Spring Security 入门篇

    本文是一个笔记系列,目标是完成一个基于角色的权限访问控制系统(RBAC),有基本的用户.角色.权限管理,重点在Spring Security的各种配置.万丈高楼平地起,接下来,一步一步,由浅入深,希望 ...

  6. vscode 终端操作命令npm报错

    错误: 如果没有安装的node.js ,则需要安装. node.js官网下载地址: https://nodejs.org/zh-cn/ 安装node.js 后会看到C:\Users\XXX\AppDa ...

  7. HOOK技术之SSDT hook(x86/x64)

    x86 SSDT Hook 32位下进行SSDT Hook比较简单,通过修改SSDT表中需要hook的系统服务为自己的函数,在自己的函数中进行过滤判断达到hook的目的. 获取KeServiceDes ...

  8. liunx磁盘挂载操作

    目标: 欲挂载目录:/home欲挂载磁盘:/dev/sdd 1.查看磁盘使用情况 [root@localhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 47 ...

  9. 关于this的解析:看了就懂,忘记了随时回来看

    初识this this => 永远表示某个对象,但写在不同的地方,它表示不同的对象 全局下的this: window => 浏览器环境下的全局对象 console.log(this) =& ...

  10. 联想INTEL X86台式机 用光驱启动 usb光驱启动

    联想INTEL X86台式机  用光驱启动 usb光驱启动 启动项顺序 都要调整 主要顺序 自动顺序 出错顺序 按下f10 f12