一、概述

  

  

二、英雄类 

 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. AspNetCore使用MySQL

    既然NetCore开源,那么也使用开源的MySQL的数据库呢?当然NetCore不止单单配MSSQL数据库而已.今天我来讲解NetCore怎么使用MySQL进行开发. 首先新建一个NetCore项目 ...

  2. JavaScriptDOM对象和jQuery对象的互相转换

    前言: 首先我们思考能不能直接在jQuery对象上调用原生DOM对象的方法或者直接在原生DOM对象调用jQuery对象呢?答案是否定的,我们看下把body背景色变为红色的代码: $("bod ...

  3. There is no Action mapped for namespace [/] and action name [TestAction] ass

    1.修改action的name值 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE strut ...

  4. Python subprocess ffmpeg

    # -*- coding:utf-8 -*- import os, sys, getopt import numpy as np import subprocess as sp import cv2 ...

  5. Tomcat 保存镜像实战操作( 目录挂载方法 )

    查看数据保存的位置 docker inspect --format='{{.Mounts}}' mxg_tomcat 宿主机数据保存在 /usr/local/project , 将此路径数据备份在 b ...

  6. 使用BaGet来管理内部Nuget包

    有的时候,我们想要制作一些nuget包,供自己内部调用,不想公开出去,那么就需要一个能够集中管理nuget包的服务了,今天我来给大家介绍一款轻便好用的包管理服务-----BaGet 下载并部署BaGe ...

  7. docker中pull镜像,报错 pull access denied for ubantu, repository does not exist or may require 'docker login'

    报错说明:拒绝获取ubantu,  仓库不存在或者需要登录docker 1.先尝试注册docker 2.在拉镜像前,先登录docker, 命令:docker  login 3.然后执行 docker ...

  8. JVM内存结构从永久代到元空间

    在文章<JVM之内存结构详解>中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化.作为面试官如果你还不知道,那么面试过程中是不是有些露怯? ...

  9. Anacond的介绍

    Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 因为包含了大量的科学包,Anaconda 的下载文件比较大( ...

  10. 使用linkedlist封装简单的先进先出队列

    创建一个类Queue代表队列(先进先出),添加add(Object obj) 及get()方法, 并添加main()方法进行验证 思路: 使用LinkedList实现队列,在向LinkedList中添 ...