Java双链表
一、概述

二、英雄类
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双链表的更多相关文章
- JAVA 链表操作:单链表和双链表
主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...
- java实现双链表(差点没写吐系列...)
刚才把单链表写完了,现在又把双链表写了,双链表和单链表的区别就是每个节点有prior和next两个指针,不同于单链表的一个next指针,而且,正是因为有这两个指针,所以双链表可以前后两个方向去移动指针 ...
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...
- 图解双链表(Java实现)
原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以但链表为主,但实际上在实际应用中双链表的应用多一些就比如Li ...
- JAVA容器-模拟LinkedList实现(双链表)
概述 LinkedList实质上就是双向链表的拓展的实现,我们将关注一下问题.LinkedList 1.双向链表怎么来实现插入.删除.查询? 2.利用二分法提高查询效率. 3.不同步,线程不安全,需要 ...
- 双链表算法原理【Java实现】(八)
前言 前面两节内容我们详细介绍了ArrayList,一是手写实现ArrayList数据结构,而是通过分析ArrayList源码看看内置实现,关于集合内容一如既往,本节课我们继续学习集合LinkedLi ...
- java实现链表
单链表 package com.voole.linkedlist; public class Test { public static void main(String[] args) { Linke ...
- 数据结构——基于java的链表实现(真正理解链表这种数据结构)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10759599.html,否则将追究法律责任!!! 一.链表介绍 1.什么是链表? 链表是一 ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
随机推荐
- 一些关于C#发送邮件的代码
1.命名空间 using System.Net.Mail; 2.创建一个MailMessage类的对象 MailMessage mail = new MailMessage(); MailMessag ...
- CSS中如何设置父元素透明度不影响子元素透明度
原因分析: 使用css的opcity属性改变某个元素的透明度,但是其元素下的子元素的透明度也会被改变,即便重定义也没有用,不过有个方法可以实现,大家可以看看. 可以使用一张透明的图片做背景可以达成效果 ...
- Solr的学习使用之(七)Solr高级查询facet、facet.pivot简介
以下转载自:http://hongweiyi.com/2013/03/apache-solr-facet-introduction/ 1.什么是Faceted Search Facet['fæsɪt] ...
- 09.Linux系统由于不正常关机导致的分区问题
问题:Error:UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY Give root password for maintenance ------------ ...
- Nginx安装与配置-Centos7
Nginx是一款高性能免费开源网页服务器,也可用于反向代理和负载均衡服务器.该软件由伊戈尔·赛索耶夫于2004年发布,2019年3月11日,Nginx被F5 Networks以6.7亿美元收购.201 ...
- readlink 查看符号链接的文件的内容
1. 命令功能 readlink 查看软链接文件里的真实内容. 2. 语法格式 readlink [option] file 参数 参数说明 -f 后跟软链接文件 3. 使用范例 范例1 查看文件链 ...
- WTSQueryUserToken failed
https://www.cnblogs.com/tabjin/articles/11057663.html 令牌错误 https://www.cnblogs.com/FCoding/archive/2 ...
- LA 6834 Shopping
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- window.onload()和$(document).ready的区别( $(document).ready == $(function(){ }) )
首先$(function(){}) 和 $(document).ready(function(){}) 是一个方法,$(function(){})为简写(用的多) $(document).ready和 ...
- Listary安装+破解
Listary 是 windows 下一个可以快速搜索所有程序,文件,并且可以快速启动程序和打开相应文件的这么一个工具,但这只是它的一个主要功能,还有其功能也是很屌的. 详细的介绍参考:[Listar ...