Java自己实现双向链表LinkList

/**
 * <p>
 * Node 双向链表实体类
 * <p>
 * 
 * @author <a href="mailto:yangkj@corp.21cn.com">yangkj</a>
 * @version
 * @since 2016年8月15日
 */
public class Node {
    
    // 双向链表-前一节点
    Node previous;
    // 双向链表-当前节点对象
    Object obj;
    // 双向链表-后一节点
    Node next;

    public Node() {
        super();
    }

    public Node(Node previous, Object obj, Node next) {
        super();
        this.previous = previous;
        this.obj = obj;
        this.next = next;
    }

    public Node getPrevious() {
        return previous;
    }

    public void setPrevious(Node previous) {
        this.previous = previous;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

}
/**
 * 
 * <p>
 * MyLinkList 双向列表
 * <p>
 * 
 * @author <a href="mailto:yangkj@corp.21cn.com">yangkj</a>
 * @version
 * @since 2016年8月15日
 */
public class MyLinkList {
    /**
     * 首节点
     */
    private Node firstNode;
    /**
     * 尾节点
     */
    private Node lastNode;
    /**
     * 节点个数
     */
    private int size;

    public MyLinkList() {
        super();
    }

    /**
     * 添加节点
     * 
     * @param obj
     */
    public void add(Object obj) {
        if (firstNode == null) {
            // 如果链表为空,则设置当前对象为首节点,同时也是尾节点;且该节点的前一节点和后一节点都为null
            Node node = new Node(null, obj, null);
            firstNode = node;
            lastNode = node;
        } else {
            // 直接在lastNode后面添加新的节点
            Node node = new Node(lastNode, obj, null);
            // 旧的尾节点的下一个节点指向新加节点
            lastNode.setNext(node);
            // 链表的尾节点设成新加节点
            lastNode = node;
        }
        size++;
    }

    /**
     * 指定索引位置上插入节点
     * 
     * @param index
     * @param obj
     */
    public void add(int index, Object obj) {
        Node temp = node(index);
        if (temp != null) {
            Node up = temp.previous;
            Node newNode = new Node(up, obj, temp);
            up.setNext(newNode);
            temp.setPrevious(newNode);
            size++;
        }
    }

    /**
     * 获取指定节点对象
     * 
     * @param index
     * @return
     */
    public Object get(int index) {
        Node temp = node(index);
        if (temp != null) {
            return temp.obj;
        } else {
            return null;
        }
    }

    /**
     * 越界检测
     * 
     * @param index
     */
    private void rangCheck(int index) {
        if (index < 0 || index > size) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
    }

    /**
     * 移除指定索引 的节点
     * 
     * @param index
     */
    public void remove(int index) {
        // 越界检测
        Node temp = node(index);
        if (temp != null) {
            Node up = temp.previous;
            Node down = temp.next;
            up.next = down;
            up.previous = up;
            temp = null;
            size--;
        }

    }

    /**
     * 获取指定索引下的节点
     * 
     * @param index
     * @return
     */
    private Node node(int index) {
        rangCheck(index);
        Node temp = null;
        if (firstNode != null) {
            temp = firstNode;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }
        }
        return temp;
    }
    /**
     * 设置指定索引的值
     * @param index
     * @param obj
     */
    public void set(int index,Object obj){
        rangCheck(index);
        Node temp = node(index);
        if(temp!=null){
            temp.setObj(obj);
        }
    }
    /**
     * 获得链表长度
     * 
     * @return
     */
    public int size() {
        return size;
    }

    public static void main(String[] args) {
        MyLinkList linkList = new MyLinkList();
        linkList.add("aaa");
        linkList.add("bbb");
        linkList.add("ccc");
        
        System.out.println(linkList.get(1));
        linkList.set(1, "fff");
        System.out.println(linkList.get(1));
        
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值