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. 已知由一个线性链表表示的线性表中含有 3 类字符的数据元素(如:字母,数字和其他字符),试编写算法将该线性链表分割为 3 个循环链表,其中每个循环链表均只含有一类字符。

    先封装一个单链表LA,引用Creat()函数利用尾插法来生成链表,先输入n值来确定单链表中数据元素的个数,然后通过键盘输入元素,创建3个空链表来存放三种不同字符类型,通过Match()中的ASCII码 ...

  2. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  3. 单链表-两个线性表的合并(不破坏原链表+尾插法)

    题意: 令L1 = (X1,X2,X3,X4-Xn), L2 = (y1,y2,y3,y4-ym);是两个线性表.采用带头节点的链表存储,设计一个算法合并L1,L2,结果放在线性表L3中,要求如下: ...

  4. 单链表-两个线性表的合并1(破环原链表+尾插法)

    题意: 令L1 = (X1,X2,X3,X4-Xn), L2 = (y1,y2,y3,y4-ym);是两个线性表.采用带头节点的链表存储,设计一个算法合并L1,L2,结果放在线性表L3中,要求如下: ...

  5. 2-1-单链表顺序存储结构-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第2章  线性表 - 单链表顺序存储结构 --<数据结构>-严蔚敏.吴伟民版        ★有疑问先阅读★ 源码使用说明  链接☛☛☛ <数据结构-C语言版>( ...

  6. 数据链表:双向循环链表交换结点

    要求:已知p指向双向循环链表中的一个结点,其结点结构为data.prior.next三个域,写出算法change§,交换p所指向的结点和它的前缀结点的顺序. [题目分析] 知道双向循环链表中的一个结点 ...

  7. 已知由单链表表示的线性表中含有三类字符(数字,字母和其他字符)试编写算法来构造三个循环链表,使每个表中只含某一类字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。

    核心算法: void Classify(LinkList LA,LinkList LB,LinkList LC){//LA为原表,LB,LC为已经初始化的单链表头结点Node *pa,*pb,*pc; ...

  8. YTU OJ 2221: 两个链表之间问题(线性表)

    题目描述 已知两个单链表A和B,其头指针分别为heada和headb,编写一个过程从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前. 输入 前三个数分别表示 ...

  9. 可由一个尾指针唯一确定的链表有_L2数据结构第08课 单向链表和循环链表

    L2-数据结构-第08课 单向链表和循环链表 线性表 线性表是一种常用的数据结构,其中的每一个元素(结点)都有唯一的前驱和唯一的后续.当然,第一个元素只有后续,最后一个元素只有前驱. 线性表一般分为& ...

最新文章

  1. spoj A Needle in the Haystack(rabin-karp)
  2. 如何解决Bluetooth系统设计的棘手问题
  3. 注册不到两年半Github标星39k+,吴恩达、李航老师的作品的笔记和代码实现
  4. J.U.C 提供的阻塞队列
  5. 2019广州车展:国产版特斯拉Model 3正式亮相
  6. 2017计算机c语言大纲,2017年计算机考研大纲
  7. js实现点击“验证码”开始倒计时
  8. 【第一部分】04Leetcode刷题
  9. c语言一行灯的熄灯问题,熄灯问题
  10. 【asm】汇编器yasm使用说明
  11. linux磁盘检测和修复
  12. 三星android 8.0 流畅,三星Galaxy S8使用安卓Android 8.0:更顺滑更流畅
  13. STM32 I2C驱动0.96寸OLED屏
  14. Linux从零学习记录(三)
  15. 大型电商架构亿级流量电商详情页系统--实战 服务降级
  16. 思科6509 引擎720-3BXL 更换风扇造成设备重启
  17. ionic 打 android 出现 Current working directory is not a Cordova-based project.
  18. FTP、NFS、SMBA区别
  19. echarts中国地图china.js下载
  20. 4412驱动-sixth_drv 同步互斥按键驱动

热门文章

  1. WCF入门(一)——简单的示例
  2. html无规律卡片布局,如何实现同等间隙的卡片布局
  3. python绘制月亮_Python函数
  4. vue webpack打包入口文件是哪个_Vue项目起步
  5. 计算机二级理工类报哪个,计算机二级考哪一科目,毕业后找工作会对科目有要求吗?还是说不管什么科目有证就行了?...
  6. python海龟画笔如何运行_Python海龟绘图:turtle的简单使用
  7. oracle10个,OracleDBA新手经常碰到的10个Oracle错误
  8. python只读打开文件_Python 文件只读打开模式是???????????????????????????????????????
  9. 平年闰年c语言源代码,C语言平年闰年问题
  10. linux服务器六个状态,六、Linux_SSH服务器状态