您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 编程语言综合 >> 正文

java双向循环链表实现程序

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   例1

 代码如下  

package com.xlst.util;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
 /**
  * 双向循环链表
  * 完成时间:2012.9.28
  * 版本1.0
  * @author xlst
  *
  */
 public class BothwayLoopLinked {
     /**
      * 存放链表长度的 map
      * 
      * 如果简单使用 static int 型的 size 基本类型变量,则只能维护一个双向循环链表。
      * 同时存在两个及以上双向循环链表时,数据会错乱
      */
     private static final Map<String, Integer> sizeMap = new HashMap<String, Integer>();
     /**
      * 双向链表的 id
      * 一个双向一个唯一的 id
      * 根据这个id可以从 sizeMap 中取出当前链表的长度
      */
     private String linkedId = null;
     
     /**
      * 节点中的数据
      */
     private Object data = null;
     
     /**
      * 前一个节点(初始化时是自身)
      */
     private BothwayLoopLinked prev = this;
     /**
      * 后一个节点(初始化时是自身)
      */
     private BothwayLoopLinked next = this;
     
     public BothwayLoopLinked(){}
     
     /**
      * 在节点之后插入新节点
      * @param newLinked 新插入的节点
      */
     public void insertAfter(BothwayLoopLinked newLinked){
         //    原来的前节点与后节点
         BothwayLoopLinked oldBefore = this;
         BothwayLoopLinked oldAfter = this.next;
         
         //    设置 newLinked 与原前节点的关系
         oldBefore.next = newLinked;
         newLinked.prev = oldBefore;
         
         //    设置 newLinked 与原后节点的关系
         oldAfter.prev = newLinked;
         newLinked.next = oldAfter;
         
         //    链表长度加一
         changeSize(+1);
         //    绑定新节点的 linkedId
         newLinked.linkedId = this.linkedId;
     }
     
     /**
      * 在节点之前插入新节点
      * @param newLinked 新插入的节点
      */
     public void insertBefore(BothwayLoopLinked newLinked){
         //    原来的前节点与后节点
         BothwayLoopLinked oldBefore = this.prev;
         BothwayLoopLinked oldAfter = this;
         
         //    设置 newLinked 与原前节点的关系
         oldBefore.next = newLinked;
         newLinked.prev = oldBefore;
         
         //    设置 newLinked 与原后节点的关系
         oldAfter.prev = newLinked;
         newLinked.next = oldAfter;
         
         //    链表长度加一
         changeSize(+1);
         //    绑定新节点的 linkedId
         newLinked.linkedId = this.linkedId;
     }
     
     /**
      * 从链表结构中删除自身
      * @return 被删除的节点
      */
     public BothwayLoopLinked remove(){
         return remove(this);
     }
     /**
      * 从链表结构中删除指定节点
      * @param linked 要删除的节点
      * @return 被删除的节点
      */
     public BothwayLoopLinked remove(BothwayLoopLinked linked){
         linked.prev.next = linked.next;
         linked.next.prev =