您的位置:首页 > 编程语言 > Java开发

单向链表--java实现

2015-12-22 17:10 609 查看
我们都知道,java中自带了许多的数据结构。这些数据结构被封装的很好,使得我们用的很方便,但是我们却不知道这些数据结构具体是怎么实现的。

于是,自己尝试着实现了一个链表。

单向链表示意图:



单向链表实现代码:

[code]public class LinkedList<E> {

    private class Node<E>{
        public E value;
        public Node<E> next;

        public Node(E value,Node<E> next) {
            this.value = value;
            this.next = next;
        }
    }

    private int size;
    public Node<E> head;

    /**
     * constructor
     */
    public LinkedList() {
        head = new Node<E>(null, null);
        head.next = head;
        size = 0;
    }

    /**
     * 获取链表长度
     * @return
     */
    public int size(){
        return size;
    }

    /**
     * 判断链表是否为空
     * @return
     */
    public boolean isEmpty(){
        return size == 0;
    }

    public void validateIndex(int index){
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        return;
    }
    /**
     * 从链表头部添加元素
     * @param value
     */
    public void add(E value){
        Node<E> cur = new Node<E>(value, head.next);
        head.next = cur;
        size++;
        return;
    }

    /**
     * 添加到链表的尾部
     * @param value
     */
    public void addLast(E value){
        Node<E> node = getNode(size - 1);
        Node<E> cur = new Node<E>(value, null);
        node.next = cur;
        size++;
        return;
    }
    /**
     * 获取位置index的节点
     * @param index
     * @return
     */
    public Node<E> getNode(int index){

        validateIndex(index);
        Node<E> cur = head.next;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur;
    }

    /**
     * 获取位置为index的节点值
     * @param index
     * @return
     */
    public E get(int index){
        return getNode(index).value;
    }

    /**
     * 插入一个节点
     * @param index
     * @param value
     */
    public void insert(int index,E value){

        validateIndex(index);
        if (index == 0) {
            add(value);
            return;
        }
        Node<E> preNode = getNode(index - 1);//插入位置前一个节点
        Node<E> node = getNode(index);//插入位置原始的节点,插入后为插入节点的下一个节点
        Node<E> cur = new Node<E>(value, node); //准备插入的节点
        preNode.next = cur;
        size++;
        return;

    }

    /**
     * 删除一个节点
     * @param index
     */
    public void delete(int index){
        validateIndex(index);
        if (index == 0) {
            head.next = head.next.next;
            size--;
            return;
        }
        Node<E> node = getNode(index - 1);
        node.next = node.next.next;
        size--;
        return;
    }

    /**
     * 删除第一个节点
     */
    public void deleteFirst(){
        delete(0);
        return;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: