一、概述

  

  

二、英雄类 

 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. 2019-5-28-VisualStudio-扩展开发

    title author date CreateTime categories VisualStudio 扩展开发 lindexi 2019-05-28 19:51:49 +0800 2018-2-1 ...

  2. SIGINT、SIGQUIT、 SIGTERM、SIGSTOP区别

    2) SIGINT程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程. 3) SIGQUIT和SIGINT类似, 但由QUIT字符(通 ...

  3. 【改】shell 判断文件中有无特定子串方法(grep)

    转自:https://blog.csdn.net/zhuguiqin1/article/details/79160923 利用grep执行的命令结束代码$?的值来判断是否已经grep到特定的值. 当$ ...

  4. $PMTargetFileDir 参数位置

    系统/session参数与变量参数和变量都配置在Session中,如$PMTargetFileDir.$PMBadFileDir等.这些变量有哪些.在哪里定义.是否可以修改呢?在控制台(Admin C ...

  5. Kubernetes部署DNS

    前言 阅读地址 http://thoreauz.com/2017/04/16/docker/Kubernetes%E9%83%A8%E7%BD%B2DNS%E5%92%8CDashboard/ Kub ...

  6. CSS3 结构性伪类选择器(1)

    1.CSS3 结构性伪类选择器—root :root选择器就是匹配元素E所在文档的根元素.在HTML文档中,根元素始终是<html>. “:root”选择器等同于<html>元 ...

  7. 学习python os commands socket模块

    import os print(os.getcwd()) #获取当前路径, 导包也是从这个路径下面才能找到 # os.chdir('./..') #返回上一级路径,再获取路径看看 # print(os ...

  8. Python---基础---数据类型的内置函数

    2019-05-23 ---------------------------- 一. #数据类型的内置函数Python有哪些数据类型?Number   数值型string   字符型list     ...

  9. Python比较两个excel文档内容的异同

    #-*- coding: utf-8 -*- #比对两个Excel文件内容的差异#---------------------假设条件----------------#1.源表和目标表格式一致#2.不存 ...

  10. Web自动化-浏览器驱动chromedriver安装方法

    1.python中安装好selenium包  pip install selenium 2.根据以下驱动对照表下载Chrome对驱动   chromedriver版本 支持的Chrome版本 v2.3 ...