一、概述

  

  

二、英雄类 

 class HeroNode {
//值域
public int id;
public String name;
public String nickName;
//指针域
public HeroNode next;
public HeroNode prev; HeroNode(int id, String name, String nickName) {
this.id = id;
this.name = name;
this.nickName = nickName;
}
}

三、主方法

     private  HeroNode head = null;
private HeroNode last = null;
@Test
public void test() {
/* insertNodeBefore(new HeroNode(1, "松江", "及时雨"));
insertNodeBefore(new HeroNode(2, "武松", "行者"));
insertNodeBefore(new HeroNode(3, "林冲", "豹子头"));*/
insertNodeAfter(new HeroNode(1, "松江", "及时雨"));
insertNodeAfter(new HeroNode(2, "武松", "行者"));
insertNodeAfter(new HeroNode(3, "林冲", "豹子头")); deleteNode(2);
deleteNode(1);
deleteNode(3);
printLinkedLast();
}

四、操作

   双链表操作跟单链表相差无几,所以只写了插入和打印操作

  1、最前插入节点

 //插入新节点
public void insertNode(HeroNode head, HeroNode newNode) {
if (head == null) {
System.out.println("头结点不能为空");
return;
}
HeroNode hn = head;
//循环到最后一个节点,它的next=null,即hn.next==null
while (hn.next != null) {
hn = hn.next;
}
//将hn.next指向新节点
hn.next = newNode;
//新节点的prev指向hn,即新节点的前一个节点
newNode.prev = hn;
}

  2、最后插入节点

     //插入新节点(插入最前面)
public void insertNodeBefore(HeroNode newNode) {
//如果插入的是第一个元素
if(head==null){
head = newNode;
head.prev=null;
head.next=null;
last = head;
}else {
newNode.prev = null;
newNode.next = head;
head.prev = newNode;
head = newNode;
}
}

  3、打印双向链表(根据head向后遍历打印)

     //打印双向链表(根据head打印)
public void printLinkedHead() {
if (head == null) {
System.out.println("链表为空");
return;
}
HeroNode tmp = head;
while (tmp!= null) {
System.out.println(show(tmp));
tmp = tmp.next;
}
}

  4、打印双向链表(根据last向前遍历打印)

 //打印双向链表(根据head打印)
public void printLinkedLast() {
if (last == null) {
System.out.println("链表为空");
return;
}
HeroNode tmp = last;
while (tmp!= null) {
System.out.println(show(tmp));
tmp = tmp.prev;
}
}

  5、删除节点

     public  void deleteNode(int id){
if (last == null) {
System.out.println("链表为空");
return;
}
HeroNode tmp = last;
while (tmp!= null) {
if(tmp.id==id){
//只有一个节点,
if(last.id==id && head.id==id){
head = null;
last = null;
}
//有两个节点,删除后一个
else if(last.id == id && head.id!=id){
head.next=null;
last = head;
}
//有两个节点,删除前一个
else if(head.id==id && last.id!=id){
last.prev = null;
head = last;
}
//有两个以上节点
else{
//当前节点的前一个节点的下一个节点,指向当前节点的下一个节点
tmp.prev.next=tmp.next;
//当前节点的下一个节点的前一个节点,指向当前节点的前一个节点
tmp.next.prev=tmp.prev;
}
return;
}
tmp = tmp.prev;
}
}

  5、打印的辅助方法 

 public String show(HeroNode h) {
return "{" +
"本节点id=" + convertNode(h) + '\'' +
"id=" + h.id +
", name='" + h.name + '\'' +
", nickName='" + h.nickName + '\'' +
", prev=" + convertNode(h.prev) + '\'' +
", next=" + convertNode(h.next) + '\'' +
'}' + "\n";
} //格式化HeroNode,直接输出地址值
public String convertNode(HeroNode h) {
return h == null ? null : h.toString().substring(h.toString().lastIndexOf('@'));
}

五、结果展示

  

Java双链表的更多相关文章

  1. JAVA 链表操作:单链表和双链表

    主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...

  2. java实现双链表(差点没写吐系列...)

    刚才把单链表写完了,现在又把双链表写了,双链表和单链表的区别就是每个节点有prior和next两个指针,不同于单链表的一个next指针,而且,正是因为有这两个指针,所以双链表可以前后两个方向去移动指针 ...

  3. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  4. 图解双链表(Java实现)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以但链表为主,但实际上在实际应用中双链表的应用多一些就比如Li ...

  5. JAVA容器-模拟LinkedList实现(双链表)

    概述 LinkedList实质上就是双向链表的拓展的实现,我们将关注一下问题.LinkedList 1.双向链表怎么来实现插入.删除.查询? 2.利用二分法提高查询效率. 3.不同步,线程不安全,需要 ...

  6. 双链表算法原理【Java实现】(八)

    前言 前面两节内容我们详细介绍了ArrayList,一是手写实现ArrayList数据结构,而是通过分析ArrayList源码看看内置实现,关于集合内容一如既往,本节课我们继续学习集合LinkedLi ...

  7. java实现链表

    单链表 package com.voole.linkedlist; public class Test { public static void main(String[] args) { Linke ...

  8. 数据结构——基于java的链表实现(真正理解链表这种数据结构)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10759599.html,否则将追究法律责任!!! 一.链表介绍 1.什么是链表? 链表是一 ...

  9. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

随机推荐

  1. win32 socket编程(五)——客户端实例(TCP)

    一.客户端操作流程 1.1 加载套接字库(WSAStartup()) 1.2创建套接字(socket()). 1.3向服务器发出连接请求(connect()). 对于客户端来说,它不需要绑定,可以直接 ...

  2. JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  3. openstack stein部署手册 9. neutron

    # 安装程序包 yum -y install openstack-neutron-linuxbridge ebtables ipset # 变更配置文件 mv /etc/neutron/neutron ...

  4. 输vim /etc/rc.d/init.d/mysqld 报错 …..localdomain.pid

    在安装MySQL的过程中出现以下错误: 本人解决方法是: ps aux | grep mysqld 罗列出所有关于mysqld的进程,然后把关于mysqld的进程都kill了.

  5. 读书笔记三、pandas之重新索引

  6. jpype测试报错,找不到类raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)

    最近用jpype测试java代码 公司电脑跑着没有问题,家里电脑怎么也不行,python,jdk版本啥的都一样,但总是报找不到类名的错误 raise _RUNTIMEEXCEPTION.PYEXC(& ...

  7. lvm分区创建和扩容

    shell> fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command action a toggle a bootab ...

  8. [sql 注入] 注入类型

    基于整型的注入: url:http://localhost/?id=12 拼接sql:$sql = "select * from user where id = {$_GET['id']}& ...

  9. 【串线篇】spring boot全面接管springMvc

    一.Spring MVC auto-configuration Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默认配置:(WebMvcAutoC ...

  10. ubuntu idea 安装

    一.下载 1.进入官网 下载对应安装包 https://www.jetbrains.com/idea/download/#section=linux sudo wget https://downloa ...