直接上代码

//节点
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. Windows 10 系统进入测试模式命令

    首先需要开启测试模式,内容如下: @bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS @bcdedit -set TESTSIGNING ON 取消 ...

  2. Android拆分与加载Dex的多种方案对比

    http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207151651&idx=1&sn=9eab282711f4eb2b ...

  3. (CV学习笔记)Attention

    Attention(注意力机制) Attention for Image Attention for Machine Translation Self-Attention 没有image-Attent ...

  4. vuex、localStorage、sessionStorage之间的区别

    vuex存储在内存中,localStorage以文件形式存储在本地,sessionStorage针对一个session(阶段)进行数据存储. 当页面刷新时vuex存储的数据会被清除,localStor ...

  5. ubuntu中执行可执行文件时报错“没有那个文件或目录”的解决办法(非权限问题)

    问题:可执行文件明明存在,也有可执行权限(x),但执行时就提示"没有那个文件或目录". 原因:这个程序的是32位的程序(比如arm-linux-gcc),而系统是64位的,运行时需 ...

  6. OO随笔之纠结的第二单元——多线程电梯

    综述 主要任务就是写一个电梯模拟器,读入每一个人的请求然后让电梯把他们送到想去的地方. 从第一次到第三次作业,三次的主要任务都是相同的,但是每次都增加了很多的细节,每次的难度都逐步增长,电梯复杂度和瞎 ...

  7. python类变量的分类和调用方式

    #!/usr/bin/python # -*- coding: UTF-8 -*- # 父类 class JustCounter: ''' 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中 ...

  8. 039.Python使用TCP实现多用户并发

    使用TCP实现多用户并发 在前面的实验中,TCP建立连接时,只能允许一个用户连接,当第二个用户建立连接时,发送的信息,服务端是没有办法接受,只有当第一个用户退出时,才能接受到第二个用户的请求,并实现通 ...

  9. Linux进阶之进程管理

    本节内容 1.进程管理 2.ps 3.uptime 4.top 5.ss -tnl------ lsof -i :22 一. 进程管理的概念 程序:二进制文件,静态 /bin/date,/usr/sb ...

  10. C语言中位运算异或“∧”的作用

    1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算    ...