当前位置: 首页 > 编程日记 > 正文

链表 -- 双向循环链表(线性表)

1,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

2,构建节点类

public class DNode<E> {Object item;DNode<E> prev;DNode<E> next;public DNode(){}public DNode(DNode<E> prev,Object item,DNode<E> next){this.item = item;this.prev = null;this.next = null;}
}

3,构建链表类,以增加节点和删除节点为例

public class DLink<E> {int size;DNode<E> first;DNode<E> last;public DLink() {this.size = 0;this.first = null;this.last = null;}public boolean isEmpty() {return first == null;}public void addNode(Object o) {final DNode<E> l = last;final DNode<E> f = first;DNode<E> newNode = new DNode<E>(l, o, null);last = newNode;if (l == null) {first = newNode;first.next = newNode;last.prev = newNode;first.prev = newNode;} else {l.next = newNode;f.prev = newNode;newNode.prev = l;newNode.next = f;}size++;}public boolean removeNode(Object o) {if (o == null) {
            for (DNode<E> x = first; x.next != first; x = x.next) {if (x.item == null) {unlink(x);return true;}}if (last.item == null) {unlink(last);return true;}} else {for (DNode<E> x = first; x.next != first; x = x.next) {if (x.item.equals(o)) {unlink(x);return true;}if (last.item.equals(o)) {unlink(last);return true;}}}return false;}private void unlink(DNode<E> e) {final DNode<E> c = e;final DNode<E> next = c.next;final DNode<E> prev = c.prev;final DNode<E> f = first;final DNode<E> l = last;if (c == first) {first = f.next;first.prev = l;l.next = first;return;}if (c == last) {last = l.prev;last.next = first;first.prev = last;return;}prev.next = next;next.prev = prev;size--;}public void display() {for (DNode<E> x = first; x.next != first; x = x.next) {System.out.println(x.prev.item + " <== " + x.item + " ==> " + x.next.item);}System.out.println(last.prev.item + " <== " + last.item + " ==> " + last.next.item);}// DNode<E> x = first;// for (int i = 1; i <= DLink.size; i++) {// System.out.println(x.prev.item + " <== " + x.item + " ==> " +// x.next.item);// x = x.next;// }// }
}

4,构建测试类

public class DTest {public static void main(String[] args) {DLink dlink = new DLink();dlink.addNode("列兵");dlink.addNode("上等兵");dlink.addNode("下士");dlink.addNode("中士");dlink.addNode("上士");dlink.addNode("四级军士长");dlink.addNode("三级军士长");dlink.addNode("二级军士长");;dlink.addNode("一级军士长");dlink.addNode("少尉");dlink.addNode("中尉");dlink.addNode("中尉");dlink.addNode("上尉");dlink.addNode("少校");dlink.addNode("中校");dlink.addNode("上校");dlink.addNode("大校");dlink.addNode("少将");dlink.addNode("中将");dlink.addNode("上将");dlink.display();System.out.println("===============================================");dlink.removeNode(null);dlink.display();System.out.println("===============================================");// dlink.removeNode("列兵");// dlink.removeNode("上将");dlink.removeNode("中将");dlink.display();}
}


5,打印测试结果

上将 <== 列兵 ==> 上等兵
列兵 <== 上等兵 ==> 下士
上等兵 <== 下士 ==> 中士
下士 <== 中士 ==> 上士
中士 <== 上士 ==> 四级军士长
上士 <== 四级军士长 ==> 三级军士长
四级军士长 <== 三级军士长 ==> 二级军士长
三级军士长 <== 二级军士长 ==> 一级军士长
二级军士长 <== 一级军士长 ==> 少尉
一级军士长 <== 少尉 ==> 中尉
少尉 <== 中尉 ==> 中尉
中尉 <== 中尉 ==> 上尉
中尉 <== 上尉 ==> 少校
上尉 <== 少校 ==> 中校
少校 <== 中校 ==> 上校
中校 <== 上校 ==> 大校
上校 <== 大校 ==> 少将
大校 <== 少将 ==> 中将
少将 <== 中将 ==> 上将
中将 <== 上将 ==> 列兵
===============================================
上将 <== 列兵 ==> 上等兵
列兵 <== 上等兵 ==> 下士
上等兵 <== 下士 ==> 中士
下士 <== 中士 ==> 上士
中士 <== 上士 ==> 四级军士长
上士 <== 四级军士长 ==> 三级军士长
四级军士长 <== 三级军士长 ==> 二级军士长
三级军士长 <== 二级军士长 ==> 一级军士长
二级军士长 <== 一级军士长 ==> 少尉
一级军士长 <== 少尉 ==> 中尉
少尉 <== 中尉 ==> 中尉
中尉 <== 中尉 ==> 上尉
中尉 <== 上尉 ==> 少校
上尉 <== 少校 ==> 中校
少校 <== 中校 ==> 上校
中校 <== 上校 ==> 大校
上校 <== 大校 ==> 少将
大校 <== 少将 ==> 中将
少将 <== 中将 ==> 上将
中将 <== 上将 ==> 列兵
===============================================
上将 <== 列兵 ==> 上等兵
列兵 <== 上等兵 ==> 下士
上等兵 <== 下士 ==> 中士
下士 <== 中士 ==> 上士
中士 <== 上士 ==> 四级军士长
上士 <== 四级军士长 ==> 三级军士长
四级军士长 <== 三级军士长 ==> 二级军士长
三级军士长 <== 二级军士长 ==> 一级军士长
二级军士长 <== 一级军士长 ==> 少尉
一级军士长 <== 少尉 ==> 中尉
少尉 <== 中尉 ==> 中尉
中尉 <== 中尉 ==> 上尉
中尉 <== 上尉 ==> 少校
上尉 <== 少校 ==> 中校
少校 <== 中校 ==> 上校
中校 <== 上校 ==> 大校
上校 <== 大校 ==> 少将
大校 <== 少将 ==> 上将
少将 <== 上将 ==> 列兵

转载于:https://www.cnblogs.com/pickKnow/p/9593069.html

相关文章:

开发脚本自动部署及监控

1.编写脚本自动部署反向代理、web、nfs&#xff1b; 要求&#xff1a; I、部署nginx反向代理三个web服务&#xff0c;调度算法使用加权轮询&#xff1b; #!/bin/shngxStatusps aux | grep -v grep |grep -c nginxfunction ngxProxyInstall() { if [ -e /usr/sbin/nginx ];the…

服务器日志显示乱码,CentosOS 6.5 服务器 控制台输出中文乱码,日志打印中文也乱码...

系统是Centos 6.5使用localeLANGen_US.UTF-8LC_CTYPE"en_US.UTF-8"LC_NUMERICzh_CN.UTF-8LC_TIME"en_US.UTF-8"LC_COLLATE"en_US.UTF-8"LC_MONETARYzh_CN.UTF-8LC_MESSAGES"en_US.UTF-8"LC_PAPERzh_CN.UTF-8LC_NAMEzh_CN.UTF-8LC_ADDR…

go linux 源码编译环境,Linux 源码安装 GO 环境

Go 安装1.4以上的版本出现的问题个人在安装 go1.9.2 的时候&#xff0c;一直 提醒的错误是&#xff1a;Building Go bootstrap tool.cmd/distERROR: Cannot find /root/go1.4/bin/go.Set $GOROOT_BOOTSTRAP to a working Go tree > Go 1.4.步骤如果之前已经安装过老版本的 G…

django html数据库连接,Django数据库连接的问题

多线程运行项目。有N个工作线程从DB中获取jobs&#xff0c;并把结果写回DB。项目运行一段时间后&#xff0c;发现数据库连接耗尽了&#xff0c;幸好内存大&#xff0c;然后一直往上调&#xff0c;最后连接数都上8000多。耗尽连接数的时候&#xff0c;postgresql会出现类似这样的…

Java Web之XML基础

有好几天没有更新博客了&#xff0c;前段时间因为要开学了&#xff0c;需要凑足学费才能继续在学校学习&#xff0c;耽误了几天&#xff0c;这两天需要补充前面需要学习的一些知识点了。今天就开始进入JavaWeb阶段吧&#xff0c;这段时间我们需要了解一些前端的知识&#xff0c…

ios NSLayoutConstraint

为了让我们的应用在不同尺寸的屏幕下都能 “正常”的表示&#xff0c;我们尽量不要把数据写死。大多数可视元素都是一个矩形区域&#xff0c;当然这个矩形区域有坐标的&#xff0c;我们有了这个区域坐标就能确定可视元素的现实位置了。但是iphone5和以前的屏幕不一样了&#xf…

分布式技术追踪 2017年第十二期

分布式系统实践 1. 深入Facebook图数据库系统&#xff08;TAO&#xff09;系列 http://dwz.cn/5zQEdo http://dwz.cn/5zQEBK http://dwz.cn/5zQEPV 摘要: TAO是Facebook 的分布式图数据库, 存储了Facebook所有的社交关系数据, TAO的QPS超过30亿, 作者曾经在Facebook做过TAO相关…

linux 统计日志数量总,shell统计日志中时间段内匹配的数量的方法

shell统计日志中时间段内匹配的数量的方法&#xff0c;有需要的朋友可以参考下。假设日志文件mtasvr.log格式如下&#xff1a;T:24583088(04:02:06)[root:Info] 6KqowLDLAgC93DFIKrENAA.41S2:from,to, queuedT:122428336(13:36:51)[root:Info] 6KqowLAbAAByYzJIZGsOAA.2W:from,…

商品评论html,商品评论列表.html

提交取 消new Vue({el: #app,data: {fullLoad:,dialogVisible:false,jsonData:{"id":"","type":"edit","list":[{"type":"grid","icon":"icon-grid-","columns":[{"…

autolayout autoresizing

WWDC 2012 Session笔记——202, 228, 232 AutoLayout(自动布局)入门 这是博主的WWDC2012笔记系列中的一篇&#xff0c;完整的笔记列表可以参看这里。如果您是首次来到本站&#xff0c;也许您会有兴趣通过RSS&#xff0c;或者通过页面左侧的邮件订阅的方式订阅本站。 AutoLayout…

MongoDB安装和MongoChef可视化管理工具的使用

MongoDBWindows 用户向导&#xff1a;https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/注意&#xff1a;最后一步时&#xff0c;左下角的勾勾要去掉&#xff0c;mongodb compass是图形化管理界面&#xff0c;下载它需要很久很久&#xff0c;还有可能一直…

angular轮播图

还是直接上代码比较好 <!doctype html><html lang"en"><head> <meta charset"UTF-8" /> <title>Document</title> <link rel"stylesheet" type"text/css" href"css/animate.min.css"…

linux 脚本的作用,shell export 作用

shell与export命令用户登录到Linux系统后&#xff0c;系统将启动一个用户shell。在这个shell中&#xff0c;可以使用shell命令或声明变量&#xff0c;也可以创建并运行shell脚本程序。运行shell脚本程序时&#xff0c;系统将创建一个子shell。此时&#xff0c;系统中将有两个sh…

标签选择器用于修改html元素默认的样式,html – 为什么CSS选择器与 sign(直接子)覆盖默认样式?...

问题不是子组合器(>)&#xff0c;它是color属性&#xff0c;它是可继承的。虽然颜色属性的初始值因浏览器而异&#xff0c;但继承是常见的。这意味着元素的文本颜色从父代继承。您在代码中看到这一点。相反&#xff0c;border属性是不可继承的。请注意&#xff0c;与文字颜色…

[hdu1828] Picture

帅哥美女们大家好&#xff01; 今天本蒟蒻补一篇题解&#xff01; 线段树维护扫描线求矩形周长并。 扫描线的话&#xff0c;跟求面积类似&#xff0c;这道题可以只扫一次&#xff0c;也可以x&#xff0c;y两个方向分别扫一次。 题目传送门 1 #include<cstdio>2 #include&…

洛谷 P2126 Mzc家中的男家丁

题目背景 &#xff4d;&#xff5a;&#xff43;与&#xff44;&#xff4a;&#xff4e;的…还没有众人皆知&#xff0c;所以我们要来宣传一下。 题目描述 &#xff4d;&#xff5a;&#xff43;家很有钱&#xff08;开玩笑&#xff09;&#xff0c;他家有&#xff4e;个男家丁…

linux如何查看内存最大的几个文件,详解Linux如何查看当前占用CPU或内存最多的几个进程...

命令ps -aux | sort -k4nr | head -N命令详解&#xff1a;1、head&#xff1a;-N可以指定显示的行数&#xff0c;默认显示10行。2、ps&#xff1a;参数a指代all――所有的进程&#xff0c;u指代userid――执行该进程的用户id&#xff0c;x指代显示所有程序&#xff0c;不以终端…

ios 真机调试

步骤&#xff1a; 一、真机调试所需材料说明二、进入申请界面三、添加App ID四、添加设备(Devices)五、添加证书(Certificates)六、添加描述文件(Provisioning Profiles)七、配置XCode 一、真机调试所需材料说明 在申请真机调试证书之前&#xff0c;先对苹果真机调试所需的文件…

html 表单内容怎么获取不到,jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办?...

jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办&#xff1f;再做一个前台的ajax方法 查网上用formdate方法上传。可是进了接口之后一直在控制台获取不到formdate的值包括formdate[0]的值也一样 接口应该是没有问题 因为用传统的表单submit提交也…

看雪CTF 2016_第八题分析

用exeinfo查看发现是x64程序&#xff0c;所以用平常的OD调试器是调试不到的&#xff0c;需要用x64的调试器 我这里是用x64dbug 这个调试器来进行调试分析 经过一步一步调试&#xff0c;发现程序调用RtlMoveMemory 这个api来进行获取我们输入的注册码 Rax的内存地址即为我们输入…

20169212 2016-2017-2 《网络攻防实践》第四周学习总结

20169212 2016-2017-2 《网络攻防实践》第四周学习总结 教材学习中的问题和解决过程 wireshark学习 主机&#xff1a;Kali ip&#xff1a;192.168.1.117 目标&#xff1a;www.bdwm.net 任务&#xff1a;捕获连接 www.bdwm.net的输入信息 利用wireshark可以清楚的看到发包的全过…

linux7挂载ntfs分区,刚安装centos7,请教大神如何挂载ntfs的分区

liangbenrang 于 2015-12-22 17:39:08发表:2、关于AS服务器Redhat5、6 CPU性能低问题&#xff0c;建议做如下调整&#xff1a;关于AS服务器Redhat5、6 CPU性能低问题&#xff0c;建议做如下调整&#xff1a;服务器BIOS设置(不同型号服务器设置方法不太一样)&#xff1a;cpu关闭…

UIViewController、UINavigationController与UITabBarController的整合使用

UINavigationController与UITabBarController是iOS开发中最常用的两种视图控制器&#xff0c;它们都属于UIViewController的子类&#xff0c;继承关系如下&#xff1a; interface UITabBarController : UIViewController <UITabBarDelegate, NSCoding> interface UINav…

小学生正确使用计算机,小学生做数学作业用计算器的做法正确吗?为什么?

用计算器做数学题是一种偷懒的做题方法&#xff0c;不知道现在的数学课本上还有没有计算机教学这一章节的内容&#xff0c;学习使用计算器也是学习内容之内的&#xff0c;但是计算器是用来解决那些较复杂的数字运算的&#xff0c;基本的四则运算还是不要用计算器&#xff0c;尽…

【php】 PHP 支持 9 种原始数据类型

PHP 支持 9 种原始数据类型。 四种标量类型&#xff1a; boolean&#xff08;布尔型&#xff09;integer&#xff08;整型&#xff09;float&#xff08;浮点型&#xff0c;也称作 double)string&#xff08;字符串&#xff09;三种复合类型&#xff1a; array&#xff08;数组…

linux安装vsftpt服务,centos安装vsftp服务.md

# 使用nginx和vsftp搭建图片服务器并使用Java上传图片到该图片服务器## 安装vsftp1、首先&#xff0c;安装vsftpdshellyum -y install vsftpd复制代码2、验证是否安装成功shellrpm -qa vsftpd复制代码3、查看vsftp相关配置文件shellll /etc/vsftpd/复制代码vsftpd.conf文件是主…

android support v4、v7、v13

android support v4、v7、v13的区别及作用和用法 1, Android Support V4, V7, V13是什么? 本质上就是三个java library。 2, 为什么要有support库? 如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要使用Support 3, 三个Support 库的…

SimpleInjector 简单使用

SimpleInjector 简单使用&#xff0c;未完待续转载于:https://www.cnblogs.com/aresyl/p/6627372.html

win设置计算机网络,Win10怎么修改网络类型,Win10网络类型怎么设置?

Win10怎么修改网络类型,Win10网络类型怎么设置?对某件事物越是了解的深入&#xff0c;越是能发现产品的猫腻!比如Win10!因为产品性能没升级多少&#xff0c;但是马甲换的却非常勤快!可能有些朋友会感觉&#xff0c;下面的内容似曾相识。下面的Win10怎么修改网络类型的内容&…

GIL+死锁与递归锁+信号量+event事件

GIL全局解释器锁: GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程 必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行 但是可以实现并发 在Cpython解释器下,如果想实现并行可以开…