1. /*双向链表特点:
  2. *1.每个节点含有两个引用,previos和next,支持向前或向后的遍历(除头节点)
  3. *2.缺点插入或删除的时候涉及到引用修改的比较多
  4. *注意:下面的双向链表其实也实现了双端链表
  5. *注意:在Java中多个引用可以指向同一个对象,也可以随时改变引用的指向
  6. * 关于修改引用细心一点就可以 引用A = 引用B 表示A引用指向B引用指向的对象
  7. *应用:利用双向链表可以实现双端队列
  8. * */
  9.  
  10. public class MyDoubleLink {
  11. private Link first;
  12. private Link last;
  13.  
  14. public boolean isEmpty(){
  15. return first == null;
  16. }
  17.  
  18. public void insertFirst(int key){
  19. Link newLink = new Link(key);
  20. if(first == null){
  21. last = newLink;
  22. }
  23. else{
  24. first.previous = newLink;
  25. }
  26. newLink.next = first;//链未断可以指向同一个
  27. first = newLink;
  28. }
  29.  
  30. public void insertLast(int key){
  31. Link newLink = new Link(key);
  32. if(first == null){
  33. first = newLink;
  34. }
  35. else{
  36. last.next = newLink;
  37. newLink.previous = last;
  38. }
  39. last = newLink;
  40. }
  41.  
  42. //插入指定值的后边---其实是一种尾巴插入--此时链表非空才可以操作
  43. public boolean insertAfter(int key,int value){
  44. Link newLink = new Link(value);
  45. Link current = first;
  46. while(current.id != key){
  47. current = current.next;
  48. if(current == null){
  49. return false;
  50. }
  51. }
  52. if(current == last){//find it at last item
  53. newLink.next = null;
  54. last = newLink;
  55. }
  56. else{
  57. newLink.next = current.next;
  58. current.next.previous = newLink;
  59. }
  60. newLink.previous = current;
  61. current.next = newLink;
  62. return true;
  63. }
  64.  
  65. public Link deleteFirst(){
  66. Link temp = first;
  67. if(first.next == null){
  68. last = null;
  69. }
  70. else{
  71. first.next.previous = null;
  72. }
  73. first = first.next;
  74. return temp;
  75. }
  76.  
  77. public Link deleteLast(){
  78. Link temp = last;
  79. if(first.next == null){
  80. first = null;
  81. }
  82. else{
  83. last.previous.next = null;
  84. }
  85. last = last.previous;
  86. return temp;
  87. }
  88.  
  89. //按照值进行删除--可能存在找不到的时候
  90. public Link delete(int key){
  91. Link current = first;
  92. while(current.id != key ){
  93. current = current.next;
  94. if(current == null){
  95. return null;
  96. }
  97. }
  98. if(current == first){//find it at first item并非只有一个节点
  99. first = current.next;
  100. }
  101. else{ //find it not first item
  102. current.previous.next = current.next;
  103. }
  104.  
  105. if(current == last){ //find it at last item
  106. last = current.previous;
  107. }
  108. else{ //find it not last
  109. current.next.previous = current.previous;
  110. }
  111. return current;
  112. }
  113.  
  114. public void diaplayFirstToLast(){
  115. System.out.println("first to last");
  116. Link current = first;
  117. while(current != null){
  118. System.out.print(current.id + " ");
  119. current = current.next;
  120. }
  121. System.out.println();
  122. }
  123.  
  124. public void displayLastToFirst(){
  125. System.out.println("last to first");
  126. Link current = last;
  127. while(current != null){
  128. System.out.print(current.id + " ");
  129. current = current.previous;
  130. }
  131. System.out.println();
  132. }
  133. }

双向链表--Java实现的更多相关文章

  1. 线性链表的双向链表——java实现

    .线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为 ...

  2. 双向链表-java完全解析

    原文:https://blog.csdn.net/nzfxx/article/details/51728516 "双向链表"-数据结构算法-之通俗易懂,完全解析 1.概念的引入 相 ...

  3. 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)

    问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左 ...

  4. 双向链表JAVA代码

      //双向链表类 publicclassDoubleLinkList{       //结点类     publicclassNode{           publicObject data;   ...

  5. LRU hashMap(拉链) + 双向链表 java实现

    //基于 hash (拉链法) + 双向链表,LRUcache //若改为开放寻址,线性探测法能更好使用cpuCache public class LRU { private class Node { ...

  6. 《剑指offer》面试题27 二叉搜索树与双向链表 Java版

    (将BST改成排序的双向链表.) 我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列.如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单.关 ...

  7. 双向链表——Java实现

    双向链表 链表是是一种重要的数据结构,有单链表和双向链表之分:本文我将重点阐述不带头结点的双向链表: 不带头结点的带链表 我将对双链表的增加和删除元素操作进行如下解析 1.增加元素(采用尾插法) (1 ...

  8. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  9. JAVA单向/双向链表的实现

    一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...

随机推荐

  1. Linux下的定时任务 - Cron服务

    最近搞咕自己的笔记系统,虽然现在是个人的使用,对于数据库的数据还是比较少,但是安全还是一个我必须注意的东西. (特别是前段时间中了比特币的病毒之后,更是让我关注了我的主机的安全的问题.) 今天的随记是 ...

  2. SSH复用代码最终版

    web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...

  3. uvalive 3708 Graveyard

    https://vjudge.net/problem/UVALive-3708 题意: 一个长度为10000的圆环上放着n个雕塑,每个雕塑之间的距离均相等,即这个圆环被n个点均分.现在需要加入m个雕塑 ...

  4. 初学者---AngularJS详解

    AngularJS 简介 AngularJs是一个用于设计动态web应用的结构框架.首先,它是一个框架,不是类库,提供一整套方案用于设计web应用.它不仅仅是一个javascript框架,因为它的核心 ...

  5. Spring c3p0连接池无法释放解决方案

    通过c3p0配置连接池的时候,在进行压力测试的时候,日志出现了这样一个错误:Data source rejected establishment of connection, message from ...

  6. vim/network/ssh

    一.编辑器--vim vi编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界面,vi是效率很高的文本编辑器.尽管在Linux上也有很多图形界面的编辑器可用,但vi在系 ...

  7. angular之$watch方法详解

    在$apply方法中提到过脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. (1)$watch简介 在diges ...

  8. ASP.NET Core中如何调整HTTP请求大小的几种方式

    一.前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值. 在ASP.NET Co ...

  9. spark与hive的集成

    一:介绍 1.在spark编译时支持hive 2.默认的db 当Spark在编译的时候给定了hive的支持参数,但是没有配置和hive的集成,此时默认使用hive自带的元数据管理:Derby数据库. ...

  10. poj3468树状数组的区间更新,区间求和

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 47174   ...