一、概述

  

  

二、英雄类 

 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. linux学习笔记(1):

    一.Linux系统简介 1.什么是linux Linux是一个免费的.多用户.多任务的操作系统,其运行方式.功能和UNIX系统很相似,但Linux系统的稳定性.安全性与网络功能是许多商业操作系统所无法 ...

  2. http的Content-Encoding和Content-Type及服务器和客户端处理流程

    比如,A 给 B发送了一条信息:hello,首先,A要告诉B,我给你发的这条数据的类型,不同类型的数据,接收方的处理方式不一样,hello属于文本类型,所以Content-Type就要设置成 text ...

  3. C#/.NET VS2017+ EF+SQLite.CodeFirst——真正实现CodeFirst

    本文所介绍的是真正的EF+CodeFirst,不需要提前建表,由代码自动生成! 进行前需要准备的: 1.下载Sqlite Experthttp://www.sqliteexpert.com/downl ...

  4. 银联银行卡查询服务-dubbo实现

    最近看到银联开放了一个银行卡查询的服务,具体内容见官网https://open.unionpay.com/tjweb/api/detail?apiSvcId=51 尝尝鲜 在文档下载目录下,下载upa ...

  5. 好玩的Linux命令-1

    Ag:比grep.ack更快的归递搜索文件内容 1:首先在linux创建个sh文件->ag.sh 2:在ag.sh里面输入如下内容并保存 #!/bin/bash set -x TEMP_DIR= ...

  6. 探讨vue的双向绑定原理及实现

    1.vue的实现原理 vue的双向绑定是由数据劫持结合发布者-订阅者模式实现的,那么什么是数据劫持?vue是如何进行数据劫持的?说白了就是通过Object.defineProperty()来劫持对象属 ...

  7. python生成HTMl报告(unittest)

      Python3 使用HTMLTestRunner.py 报错ImportError: No module named 'StringIO'处理方法 HTMLTestRunner.py文件是基于Py ...

  8. lightoj1094 - Farthest Nodes in a Tree

    1094 - Farthest Nodes in a Tree   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limi ...

  9. springboot版本依赖

    springboot2.x及以后依赖于jdk1.8及以上. 如图:

  10. xpath定位不到原因浅析

    在爬虫中,我们经常使用xpath来对元素进行定位,xpath定位分为两种,一种是绝对定位,/html/body/div[2]/div[1]/div/div[3]/a[7],另外一种是相对定位,比如r' ...