直接上代码

//节点
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. Poj 3522 最长边与最短边差值最小的生成树

    题意:       让你求一颗生成树,使得最长边和最短边长度差值最小. 思路:      额!!!感觉这个思路会超时,但是ac了,暂时没什么别的好思路,那么就先说下这个思路,大牛要是有好的思路希望能在 ...

  2. Python脚本与Metasploit交互进行自动永恒之蓝攻击

    我们首先利用 findTarget() 函数找到目标网段或目标主机中开放了445端口的主机,然后利用 confickerExploit() 函数将攻击代码写入 configure.rc 配置文件中,最 ...

  3. 解决Failed to execute goal se.eris:notnull-instrumenter-maven-plugin:0.6.8

    https://blog.csdn.net/fanrenxiang/article/details/80864908 github拉起来的项目,jdk是11,而我电脑上的jdk是1.8.原因是jdk版 ...

  4. TortoiseGit:拉代码密码错误remote: Coding 提示: Authentication failed! 认证失败,请确认您输入了正确的账号密码

    问题 在控制面板里找到凭据管理器 修改密码之后拉取密码

  5. 【c#】 使用Directory.GetFiles获取局域网中任意电脑指定文件夹下的文件

    本文为老魏原创,如需转载请留言 格式如下: // 获取IP地址为10.172.10.167下D盘下railway下的所有文件 string[] picArray = Directory.GetFile ...

  6. x265编码命令

    CQP: #/bin/bash ./x265 --input FourPeople_1280x720_60.yuv --input-res 1280x720 --fps 60 --qp 40 --fr ...

  7. Linux——定时清空日志内容和删除日志文件

    前言 最近在做性能压测试,会生成大量的日志,导致后续越压越慢,最终磁盘空间占满之类的问题.老是要手动删除日志文件,为避免此类问题发生,编写一个Linux日志定时清理的脚本,一劳永逸. 1.shell脚 ...

  8. jmeter线程组扩展空间——Stepping Thread Group

    安装方法跟安装其他插件一样,不复赘述 各个配置含义: 举个例子:一个线程组下包含了登陆和抽奖两个接口 1.继续:如果登陆接口失败,会继续执行抽奖接口 2.start next thread loop: ...

  9. Rust trait

    Rust trait Rust中的trait类似于Java中的接口,定义了一组可以被类型选择实现的"契约"或共享行为,. 特征定义: trait Playable{ fn play ...

  10. 9.1 ps:查看进程

    ps命令 用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片.如果想要动态地显示进程的信息,就需要使用top命令,该命令类似于把手机切换成录像模式.因为ps命令的功能实在是太多了, ...