java提高篇之LinkedList的实现

来源:互联网 发布:算法工程师自学 编辑:程序博客网 时间:2024/05/21 06:20

本篇的目的主要是自己去实现双向链表以能够更好的理解LinkedList。

首先定义一个Node类

package com.wonglar.linkedlist;public class Node {    //前一个结点    private Node previous;    //结点中的对象    private Object obj;    //后一个结点    private Node next;    public Node() {    }    public Node(Node previous, Object obj, Node next) {        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;    }}

具体实现

package com.wonglar.linkedlist;public class ImplLinkedList {    // 第一个结点    private Node first;    // 最后一个结点    private Node last;    // 链表中元素个数    private int size;    /**     * 向链表中添加元素     *      * @param obj     *            :待添加的元素     */    public void add(Object obj) {        Node n = new Node();        if (first == null) {            n.setPrevious(null);            n.setObj(obj);            n.setNext(null);            // 当链表中一个元素都没有的时候            // 添加一个元素,这个元素即是第一个元素,又是最后一个元素            first = n;            last = n;        } else {            // 当链表中有元素了,即往last后面添加            n.setPrevious(last);            n.setObj(obj);            n.setNext(null);            // 此时last已不是最后一个元素            last.setNext(n);            // 将新添加的元素置为last            last = n;        }        size++;    }    /**     * 通过索引得到元素     *      * @param index     *            :待得到元素的索引     * @return     */    public Object get(int index) {        rangeCheck(index);        Node temp = first;        for (int i = 0; i < index; i++) {            temp = temp.getNext();        }        return temp.getObj();    }    /**     * 根据索引,修改元素的值     *      * @param index     *            :待修改元素索引     * @param element     *            :修改后的元素的值     */    public void set(int index, Object element) {        rangeCheck(index);        Node temp = first;        for (int i = 0; i < index; i++) {            temp = temp.getNext();        }        temp.setObj(element);    }    /**     * 根据索引删除链表中的元素     *      * @param index     *            :待删除元素的索引     * @return :删除掉的元素值     */    public Object remove(int index) {        rangeCheck(index);        Node temp = this.first;        Node last = this.last;        // 如果删除第一个元素,需要将第一个元素的指向后一个结点的值设为null        // 将它的下一个元素的指向头一个结点的值设为null,然后将第二个元素赋于first        if (index == 0) {            Node down = temp.getNext();            down.setPrevious(null);            first.setNext(null);            first = down;        } else if (index == size - 1) {            temp = last;            Node up = last.getPrevious();            last.setPrevious(null);            up.setNext(null);            this.last = up;        } else {            for (int i = 0; i < index; i++) {                temp = temp.getNext();            }            Node up = temp.getPrevious();            Node down = temp.getNext();            up.setNext(down);            down.setPrevious(up);        }        size--;        return temp.getObj();    }    /**     * 根据元素值删除链表中的元素     * @param o     :待删除的元素     * @return      :是否删除成功     */    public boolean remove(Object o){        Node temp = this.first;        if(o==null){            for (int index = 0; index < this.size; index++) {                if(temp.getObj()==null){                    //执行删除操作                    remove(index);                    return true;                }                temp = temp.getNext();            }        }else{            for (int index = 0; index < this.size; index++) {                if(temp.getObj().equals(o)){                    remove(index);                    return true;                }                temp = temp.getNext();            }        }        return false;    }    /**     * 检查索引是否越界     *      * @param index     */    private void rangeCheck(int index) {        if (index < 0 || index >= size) {            throw new IndexOutOfBoundsException("索引越界异常:index:" + index + ",size:" + size);        }    }    /**     * 返回链表中元素个数     *      * @return     */    public int size() {        return size;    }}
0 0