双端链表

简介:
双端链表:
 链表中的链接点: 节点:同时具有了 向前、向后的引用
同时具有 first 、last 节点
 
链表最后一个链节点特点: next = null;
链表第一个链接点特点: previous = null;
链表 只有一个节点特点: first.next = null 或者 last.previous = null
 
特点:
遍历支持 向前、向后遍历
 
 
package doublyLinked; 
class Link{ 
      int iData; 
    Link next; 
    Link previous; 
    
   public Link( int iData){ 
     this.iData = iData; 
  } 
    
   public  void displayLink(){ 
    System.out.print( "{"+iData+ "} "); 
  } 

public  class DoublyLinked { 

   private Link first; 
   private Link last; 
    
   public DoublyLinked(){ 
    first =  null
    last =  null
  } 
    
   public  boolean isEmpty(){ 
     return first ==  null
  } 
    
   public  void insertFirst( int iData){ 
    Link newLink =  new Link(iData); 
     if(isEmpty()){ 
      last = newLink; 
    } else
      first.previous = newLink;  //原先的first    
      newLink.next = first; //* position1 这条语句放到positon1、position2 效果一样 
    } 
     //newLink.next = first;//position2 
    first = newLink;     
  } 
    
   public  void displayForward(){ 
    Link current = first; 
     while(current !=  null){ 
      current.displayLink(); 
      current = current.next; 
    } 
  } 
    
   public  void deleteFirst(){ 
     if(isEmpty()){ 
       return
    } 
     if(first.next ==  null){ //如果只有一个元素 
      last =  null
    } else
      first.next.previous =  null; // 第一个节点 previous ==null; 
    } 
    first = first.next;     
  } 
    
   public  void deleteLast(){ 
     if(isEmpty()){ 
       return
    } 
     if(first.next == null){ // 同deleteFirst() 中一样 
      first =  null
    } else
      last.previous.next =  null; //最后一个节点next =null; 
    } 
      last = last.previous;    
  } 
    
   public  void deleteKey( int key){ 
     if(isEmpty()){ 
       return
    } 
     
    Link current = first; 
     while(current.iData != key){ 
      current = current.next;    
       if(current == null){ //到最后一个节点了 
         return
      } 
    } 
     
     if(current == first){ 
      first = current.next; 
    } else
      current.previous.next = current.next; 
    } 
     
     if(current == last){ 
      last = current.previous; 
    } else
      current.next.previous = current.previous; 
    } 
  } 
    
   public  void displayBack(){ 
    Link current = last; 
     while(current !=  null){ 
      current.displayLink(); 
      current = current.previous; 
    } 
  } 
   public  void insertLast( int iData){ 
    Link newLink =  new Link(iData); 
     
     if(isEmpty()){ 
      first    = newLink; 
    } else
      last.next = newLink; 
      newLink.previous = last; 
    }    
    last = newLink; 
  } 
    
   public  boolean inserAfter( int key, int iData){ 
    Link current = first; 
     while(current.iData != key){ 
      current =current.next; 
        
       if(current ==  null){ //没有找到key 对应的值 
         return  false
      } 
    } 
    Link newLink =  new Link(iData); 
     
     if(current == last){ 
      newLink.next =  null
      last = newLink;     
    } else
      newLink.next = current.next;    
      current.next.previous = newLink;    
    } 
    newLink.previous = current; // 
    current.next = newLink; // 
     return  true
  } 
   public  static  void main(String [] args){ 
    DoublyLinked links =  new DoublyLinked(); 
    links.insertFirst(12); 
    links.insertFirst(33); 
    links.insertFirst(80); 

    links.deleteKey(33); 
    links.displayForward(); 
    System.out.println( "--------------"); 
    links.displayBack(); 
  } 

 


本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/229659,如需转载请自行联系原作者
相关文章
|
存储 前端开发 数据可视化
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
**LeGO-LOAM**的全称是 Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain 其中LeGO就是轻量级和利用地面优化,轻量级的实现就是通过两步的优化方式,利用地面优化的部分也在两步优化的第一步中。 和原始LOAM一样,通过前后两帧点云来估计两帧之间的运动,从而累加得到前端里程计的输出,和上述方法使用线面约束同时优化六自由度帧间位姿不同,LeGO-LOAM的前端分成两个步骤,每个步骤估计三自由度的变量。 通过这种方式进行帧间里程计的运算,可以提供运算效率,使得可以在嵌入式平台
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
|
11月前
|
物联网 Unix Linux
操作系统的发展历史
【10月更文挑战第15天】操作系统的发展历史
398 1
|
JavaScript Shell API
FastAPI是什么?
FastAPI是一个现代、高性能的Python Web框架,专为构建API设计。它利用标准的Python类型提示,支持同步及异步编程,并借助Pydantic实现数据验证。FastAPI以卓越的性能媲美Node.js和Go,代码简洁优雅,能自动生成交互式API文档如Swagger UI和ReDoc,方便测试和调试。其对`async`和`await`的支持使之适用于WebSocket等高并发场景。快速上手仅需安装FastAPI和Uvicorn,编写少量代码即可启动服务并访问自动生成的文档界面。FastAPI不仅易于入门,还支持复杂的功能如依赖注入和后台任务,非常适合追求高性能和快速开发的项目。
546 1
|
数据采集 自然语言处理 监控
阿里云百炼知识检索应用测评
阿里云百炼知识检索应用测评
|
前端开发
让按钮活起来:常用按钮动画效果,增强网页吸引力!
让按钮活起来:常用按钮动画效果,增强网页吸引力!
|
消息中间件 算法 调度
FreeRTOS 任务调度和任务的状态
FreeRTOS 任务调度和任务的状态
FreeRTOS 任务调度和任务的状态
|
机器学习/深度学习 人工智能 算法
主流AI服务——大专生新就业之路
主流AI服务——大专生新就业之路
420 0
|
Cloud Native Java 云计算
Java在云计算时代的新角色及挑战
【2月更文挑战第11天】 随着云计算技术的迅猛发展,Java作为一种历史悠久的编程语言,在新的技术环境下面临着前所未有的机遇与挑战。本文将深入探讨Java在云计算时代的新角色,分析其在云原生应用开发、微服务架构、容器化技术等方面的应用,并针对Java在性能优化、安全性提升、跨平台能力等方面面临的挑战提出切实可行的解决策略。通过对Java未来发展方向的展望,旨在为Java开发者在云计算时代的转型提供指导和启示。
229 6
|
监控 Java 微服务
|
数据可视化 定位技术 数据格式
看完这篇文章,我才知道 Python 制作动态图表的正确方式
关于动态图表,相信大家都或多或少的接触过一些,如果是代码水平比较不错的,可以选择 Matplotlib,当然也可以使用 pyecharts 的相关功能,不过这些工具都专注于图表的制作,也就是对于图表的数据,你是需要自行转换的。而今天介绍的这个可视化图库,完美的结合了 Pandas 数据格式,又辅以 Matplotlib 的强大功能,使得我们制作动图变得容易的多了。
看完这篇文章,我才知道 Python 制作动态图表的正确方式