用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

双向循环链表

2012-10-26 作者: 神马举报

[java]代码库

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 = linked.prev;
 
        linked.prev = linked;
        linked.next = linked;
 
        // 链表长度减一
        changeSize(-1);
        // 取消该节点的 linkedId
        this.linkedId = null;
 
        // 返回被删除的节点
        return linked;
    }
 
    /**
     * 改变链表长度(默认长度加1),私有方法
     */
    private void changeSize() {
        changeSize(1);
    }
 
    /**
     * 改变链表长度(根据参数),私有方法
     *
     * @param value
     *            改变的长度值(可以为负数)
     */
    private void changeSize(int value) {
        if (this.linkedId == null) {
            this.linkedId = UUID.randomUUID().toString();
 
            sizeMap.put(linkedId, 1 + value); // sizeMap.put(linkedId, 2);
        } else {
            Integer size = sizeMap.get(this.linkedId);
            // Integer 是引用类型,更新值之后不必再 put 回 sizeMap 里
            size += value;
        }
    }
 
    public Object getData() {
        return data;
    }
 
    public void setData(Object data) {
        this.data = data;
    }
 
    /**
     * 获取链表的长度 如果是新生的节点 或 从链表中删除的节点,则作为独立链表,长度是 1
     *
     * @return 链表的长度
     */
    public int getSize() {
        return (linkedId == null) ? 1 : sizeMap.get(this.linkedId);
    }
 
    public BothwayLoopLinked getPrev() {
        return prev;
    }
 
    public BothwayLoopLinked getNext() {
        return next;
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...