双向链表与单向链表的不同在于,容易出现空指针异常
在添加时:

heroNode.pre = temp;if(temp.next!=null){temp.next.pre = heroNode;heroNode.next = temp.next;}temp.next = heroNode;

如果刚好是最后一个里面添加,需要 temp.next!=null的限制
在删除时,
有两种情况:

//删除的不是最后一个节点则
if(temp.next!=null){temp.pre.next = temp.next;temp.next.pre = temp.pre;}else{//若是最后一个节点,则:temp.pre.next = null;}

英雄类

class HeroNode   {public int no;public String name;public String nickname;public HeroNode next;  //下一节点public HeroNode pre;  //上一节点public HeroNode(int no,String name,String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//重写toStringpublic String toString() {return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";}

定义头

class DoubleLinkedList {//头节点private HeroNode head = new HeroNode(0,"","");//获得头节点public HeroNode getHead(){return head;}

增加

public void add(HeroNode heroNode){HeroNode temp = head;boolean flag = false;while(true){if(temp.next == null){break;}if(temp.next.no>heroNode.no){break;}if(temp.next.no == heroNode.no){flag = true;break;}temp = temp.next;}//添加if(flag){System.out.println("已存在");}else{heroNode.pre = temp;if(temp.next!=null){temp.next.pre = heroNode;heroNode.next = temp.next;}temp.next = heroNode;}}

修改

//修改public void update(HeroNode heroNode){if(head.next == null){System.out.println("链表为空");return;}HeroNode temp = head.next;boolean flag = false;while(true){if(temp == null){break;}if(heroNode.no == temp.no){temp.name = heroNode.name;temp.nickname = heroNode.nickname;flag = true;break;}temp = temp.next;}if(flag){System.out.println("修改成功");}else{System.out.println("修改失败");}}

删除

public void delete(int no){if(head.next == null){System.out.println("链表为空");return;}HeroNode temp = head.next;boolean flag = false;while(true){if(temp == null){break;}if(temp.no == no){flag = true;break;}temp = temp.next;}if(flag){          if(temp.next!=null){temp.pre.next = temp.next;temp.next.pre = temp.pre;}else{temp.pre.next = null;}System.out.println("删除成功");}else{System.out.println("删除失败");}}

显示

public void list(){if(head.next == null){System.out.println("链表为空");return;}HeroNode temp = head.next;while(true){if(temp == null){break;}System.out.println(temp);temp = temp.next;}}

完整代码

package linkedList;public class DoubleLinklist {public static void main(String[] args) {HeroNode hero1 = new HeroNode(1,"松江","及时雨");HeroNode hero2 = new HeroNode(2,"吴用","智多星");HeroNode hero3 = new HeroNode(3,"卢俊义","玉麒麟");HeroNode hero4 = new HeroNode(4,"林冲","豹子头");DoubleLinkedList list= new DoubleLinkedList();/**list.add(hero1);*list.add(hero2);*list.add(hero3);*list.add(hero4);*/list.add(hero1);list.add(hero4);list.add(hero2);list.add(hero3);list.add(hero3);list.list();System.out.println("");HeroNode hero5 = new HeroNode(2,"林冲","豹子头==");list.update(hero5);list.list();list.delete(3);list.list();}}
class DoubleLinkedList {//头节点private HeroNode head = new HeroNode(0,"","");//获得头节点public HeroNode getHead(){return head;}public void list(){if(head.next == null){System.out.println("链表为空");return;}HeroNode temp = head.next;while(true){if(temp == null){break;}System.out.println(temp);temp = temp.next;}}public void add(HeroNode heroNode){HeroNode temp = head;boolean flag = false;while(true){if(temp.next == null){break;}if(temp.next.no>heroNode.no){break;}if(temp.next.no == heroNode.no){flag = true;break;}temp = temp.next;}//添加if(flag){System.out.println("已存在");}else{heroNode.pre = temp;if(temp.next!=null){temp.next.pre = heroNode;heroNode.next = temp.next;}temp.next = heroNode;}}//修改public void update(HeroNode heroNode){if(head.next == null){System.out.println("链表为空");return;}HeroNode temp = head.next;boolean flag = false;while(true){if(temp == null){break;}if(heroNode.no == temp.no){temp.name = heroNode.name;temp.nickname = heroNode.nickname;flag = true;break;}temp = temp.next;}if(flag){System.out.println("修改成功");}else{System.out.println("修改失败");}}public void delete(int no){if(head.next == null){System.out.println("链表为空");return;}HeroNode temp = head.next;boolean flag = false;while(true){if(temp == null){break;}if(temp.no == no){flag = true;break;}temp = temp.next;}if(flag){         if(temp.next!=null){temp.pre.next = temp.next;temp.next.pre = temp.pre;}else{temp.pre.next = null;}System.out.println("删除成功");}else{System.out.println("删除失败");}}}class HeroNode    {public int no;public String name;public String nickname;public HeroNode next;  //下一节点public HeroNode pre;  //上一节点public HeroNode(int no,String name,String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//重写toStringpublic String toString() {return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";}
}

双向链表实现水浒排行增删改查相关推荐

  1. 单链表实例(1)实现水浒传排行增删改查和练习

    实现水浒传排行增删改查 对于英雄类,每一个类里都有指向下一个节点的引用 public HeroNode next; 对于添加 根据编号大小,插入 对于删除 把 要删除的节点的next赋值到被删除的上一 ...

  2. 逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

    文章目录 节点类 链表类 测试类 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后 ...

  3. Java程序-单链表增删改查(实现对水浒人物的增删改查操作)

    单链表增删改查(实现对水浒人物的增删改查操作) 前言 一.链表(Linked List)介绍 二.应用实例 1.问题描述 2.代码实现 总结 前言 参考:B站,尚硅谷数据结构与算法 课程 一.链表(L ...

  4. 双向链表增删改查分析

    双向链表增删改查分析 单向链表的缺点 单向链表查找方向只能是一个方向,而双向链表可以向前或者向后查找. 单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点, ...

  5. c语言 双向链表增删修查,手写双链表,并实现增删改查

    手写双链表,并实现增删改查 public class DoublyLinkedListT { // 一个空的头节点 private final Node head = new Node(null); ...

  6. 单链表LinkedList的增删改查

    数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低(插入位置后面的元素需要集体后移),而且这两种数组的删除效率(集体前移)都很低,并且数组在创建后,其大小是固定了 ...

  7. 三、单链表增删改查原理和代码实现

    单链表 1.简单介绍 (1)单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素 ...

  8. 数据结构单链表SingleLinkedList,Java实现单链表增删改查

    文章目录 链表介绍 应用示例 链表介绍 链表是有序的列表,但是它在内存中是存储是不连续的,如下: 链表是以节点的方式来存储,是链式存储: ①每个节点包含data域存储数据,next域指向下一个节点 ② ...

  9. ListView的增删改查(实战)

    这是对ListView的增删改查相关操作的具体运用. package com.jxust.day05_09_listviewdemo;import android.app.Activity; impo ...

最新文章

  1. NOIP2005普及组第4题 循环
  2. Java 利用接口实现回调
  3. 通过Visual Studio 2005的项目模板来加速开发过程
  4. 【嵌入式】Libmodbus源码分析(二)-常用接口函数分析
  5. 保驾护航金三银四,含BATJM大厂
  6. 一加8渲染图曝光:后置三摄/五种配色可选
  7. 企业创新流程的“正向推”与“反向推”思考
  8. java中sql查找_Java 中如何使用 SQL 查询文本
  9. 【GlobalMapper精品教程】008:如何根据指定区域(shp、kml、cad)下载卫星影像?
  10. android开发收银系统源码,基于android的语音智能收银系统设计与实现-软件工程专业论文.docx...
  11. VMware下安装win7教程
  12. 上号神器扫码登录网站使用教程
  13. 在线作图|2分钟绘制一张相关性桑基图
  14. c# 十六进制数据转十六进制字符串
  15. Connect Four四子棋c++程序 - 善后处理(3)
  16. framemaker 换行
  17. 激励人生成功的10句经典英文
  18. API请求示例汇总,亲测有效,taobaotmall,1688,pinduoduo等平台数据,信息化产业
  19. .NET USEING 原理
  20. 如何编写智能合约(Smart Contract)?(II)建立加密代币

热门文章

  1. html键盘弹起代码
  2. cheerio中文API-02
  3. 百度AI攻略:车辆属性识别
  4. 简易的万年历查询系统(C++版本)
  5. 龙芯3B1500平台,源码安装nodejs过程中失败问题
  6. php sqlite linux,linux+apache+sqlite+php - 唐老鸭的日志 - 网易博客
  7. 【Python】将txt文件转换为html
  8. 台风把汽车的java,台风“利奇马”过后,大批泡水车怎么处理?“去处”让人难以接受...
  9. python抓取贴吧_零基础写python爬虫之抓取百度贴吧代码分享
  10. spring-bean对象创建销毁顺序depend-on 干预