• 技术文章 >Java >java教程

    java双向链表实现的示例代码分享

    黄舟黄舟2017-03-27 10:16:56原创687
    这篇文章主要介绍了java 实现双向链表实例详解的相关资料,需要的朋友可以参考下

    java 实现双向链表实例详解

    双向链表是一个基本的数据结构,在Java中LinkedList已经实现了这种结构,不过作为开发者,也要拥有自己显示这种结构的能力。话不多说,上代码:

    首先是链表的节点类:

    /** 
     * 链表节点 
     * @author Administrator 
     * 
     * @param <T> 
     */ 
    public class ChainNode<T> { 
     private T data; 
     //对象编号 
     private int dataNo; 
      
     public ChainNode<T> nextChainNode; 
     public ChainNode<T> preChainNode; 
     public ChainNode(T data, ChainNode<T> nextChainNode, 
       ChainNode<T> preChainNode) { 
      this.data = data; 
      this.nextChainNode = nextChainNode; 
      this.preChainNode = preChainNode; 
     } 
      
      
      
     public ChainNode(T data) { 
      this.data = data; 
     } 
     
      
     
     public int getDataNo() { 
      return dataNo; 
     } 
     
     
     
     public void setDataNo(int dataNo) { 
      this.dataNo = dataNo; 
     } 
     
     
     public void setData(T data) { 
      this.data = data; 
     } 
     
     
     
     public T getData() { 
      return data; 
     } 
      
      
    }

    然后是链表:

    <pre name="code" class="java">/** 
     * 链表实现类 
     * @author Administrator 
     * 
     * @param <T> 
     */ 
    public class Chain<T> { 
     //头节点 
     private ChainNode<T> headNode; 
     //末尾节点指针 
     private ChainNode<T> lastNode; 
     private int size; 
      
      
     //创建链表就创建头节点 
     public Chain() { 
      this.headNode = new ChainNode<T>(null); 
      this.lastNode = headNode; 
       
     } 
     //增加一个节点 
     public void addNode(T data) { 
      ChainNode<T> node = new ChainNode<T>(data); 
      if(lastNode != null){ 
       lastNode.nextChainNode = node; 
       node.preChainNode = node; 
       node.setDataNo(size); 
       lastNode = node; 
       size++; 
      } 
     } 
     //删除指定索引的节点 
     public void deleteNode(int dataNo) throws Exception { 
      if(getSize() == 0){ 
       throw new Exception("chain is empty"); 
      } 
      for (ChainNode<T> node = headNode.nextChainNode;node != null;node = node.nextChainNode) { 
       if(node.getDataNo() == dataNo){ 
        node.preChainNode.nextChainNode = node.nextChainNode; 
        if(node.nextChainNode != null){ 
         node.nextChainNode.preChainNode = node.preChainNode; 
        } 
         
        node.nextChainNode = null; 
        node.preChainNode = null; 
        size--; 
        //重新设置节点的编号 
        for (ChainNode<T> chainNode = node.nextChainNode;chainNode != null;chainNode = chainNode.nextChainNode) { 
         chainNode.setDataNo(chainNode.getDataNo()-1); 
        } 
        return; 
         
       } 
      } 
      throw new Exception("the corresponding data that can not be found"); 
     } 
     //获取指定索引的节点 
     public T get(int dataNo) throws Exception { 
      if(getSize() == 0){ 
       throw new Exception("chain is empty"); 
      } 
      for (ChainNode<T> node = headNode.nextChainNode;node != null;node = node.nextChainNode) { 
       if(node.getDataNo() == dataNo){ 
        return node.getData(); 
       } 
      } 
      throw new Exception("the corresponding data that can not be found"); 
     } 
     //修改对应索引的节点 
     public void set(int dataNo,T data) throws Exception { 
      if(getSize() == 0){ 
       throw new Exception("chain is empty"); 
      } 
      for (ChainNode<T> node = headNode.nextChainNode;node != null;node = node.nextChainNode) { 
       if(node.getDataNo() == dataNo){ 
        node.setData(data); 
        return; 
       } 
      } 
      throw new Exception("the data that is to be modified can not be found"); 
     } 
     //是否包含对应数据的节点 
     public boolean isContains(T data) throws Exception { 
      if(getSize() == 0){ 
       throw new Exception("chain is empty"); 
      } 
      for (ChainNode<T> chainNode = headNode.nextChainNode;chainNode != null;chainNode = chainNode.nextChainNode) { 
       if(chainNode.getData() == data){ 
        return true; 
       } 
      } 
       
      return false; 
     } 
     //获取节点数量(不含头节点) 
     public int getSize() { 
      return size; 
     } 
    }

    测试一下:

    public class ChainTest { 
     public static void main(String[] args) throws Exception{ 
      String oneString = "one"; 
      String twoString = "two"; 
      String threeString = "three"; 
      String fourString = "four"; 
      Chain<String> chain = new Chain<String>(); 
      chain.addNode(oneString); 
      chain.addNode(twoString); 
      chain.addNode(threeString); 
      chain.addNode(fourString); 
      for (int i = 0; i < chain.getSize(); i++) { 
       String string2 = chain.get(i); 
       System.out.println(string2); 
      } 
      try { 
       String string = chain.get(2); 
       System.out.println("the data of the second node is"+string); 
       System.out.println(chain.isContains(fourString)); 
       chain.set(1, "haha"); 
       System.out.println("modify chain"); 
       for (int i = 0; i < chain.getSize(); i++) { 
        String string2 = chain.get(i); 
        System.out.println(string2); 
       } 
        
       chain.deleteNode(3); 
       System.out.println("delete one node"); 
       for (int i = 0; i < chain.getSize(); i++) { 
        String string2 = chain.get(i); 
        System.out.println(string2); 
       } 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }

    结果:

    one
    two
    three
    four
    the data of the second node isthree
    true
    modify chain
    one
    haha
    three
    four
    delete one node
    one
    haha
    three

    以上就是java双向链表实现的示例代码分享的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:java,双向链,表
    上一篇:Java中ArrayList自定义模仿源码的示例 下一篇:详解java图形验证码生成工具类web页面校验验证码的代码案例
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一招教你使用java快速创建Map(代码分享)• PlayFramework 完整实现一个APP(十一)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网