java模拟LinkedList实现双链表,完成基本操作

来源:互联网 发布:数据库应用技术 编辑:程序博客网 时间:2024/06/10 15:04

这里写图片描述

代码:

import java.util.Arrays;import java.util.LinkedList;/** * 自定义的双向链表 * 完成CURD操作 * @author 莱格 */public class MyLinkedList {    private Node first;// 头节点    private Node last;// 尾节点    private int size;// 容器大小    /**     * 添加元素     */    public void add(Object obj) {        Node n = new Node();        if (first == null) {            n.setPrevious(null);// 将上一节点的保存上一节点信息的节点置为空            n.setObj(obj);            n.setNext(null);// 设置下一节点的信息为null            first = n;// 此时头节点尾结点都是它本身            last = n;// 此时头节点尾结点都是它本身        } else {            n.setPrevious(last);// previous将保存上一节点的信息            n.setObj(obj);// 往对象中添加数据信息            n.setNext(null);// 设置尾节点的信息为空,此时无上一节点            last.setNext(n);// 节点信息保存作为尾结点            last = n;        }        size++;    }    /**     * 返回节点的长度     */    public int size() {        return size;    }    /**     * 删除元素 思路: 删除指定索引的节点 将头节点的next指向尾节点 将尾节点的previous指向头节点     * LinkedList     */    // LinkedList<E>    public void remove(int index) {        Node temp = node(index);        if (temp != null) {            if (index == 0) {            }            Node up = temp.previous;// 获取temp的上一节点            Node down = temp.next;// 获取当前节点的下一节点            up.next = down;            down.previous = up;        }            size--;    }    /**     * 在头节点添加一个元素     * */    public void addFirst(Object obj) {        //Node temp = node(0);        Node node = new Node();        node.setObj(obj);        node.next = first;        first.previous = node;        node.previous = null;        first = node;        size++;    }    /**     * 在尾节点添加一个元素     * */    public void addLast(Object obj) {        Node node = new Node();        node.setObj(obj);        node.previous = last;        last.next = node;        node = last;        size++;    }    /**     * 删除头节点     * */    public void removeFirst() {        Node second = first.next;        second.previous = null;        first = second;        size--;    }    /**     * 删除尾结点     * */    public void removeLast() {        Node nxt = last.previous;        nxt.next = null;        last.previous = null;//help gc        last = nxt;        size--;    }    /**     * 在i节点处添加n节点     *      * */    public void add(int index, Object obj) {        checkIndex(index);        Node temp = node(index);        Node node = new Node();        node.setObj(obj);        if (temp != null) {            Node nxt = temp.next;            node.previous = temp;            temp.next = node;            nxt.previous = node;            node.next = nxt;        }        size++;    }    /**     * 获取index索引处的值     * */    public Object get(int index) {        checkIndex(index);        Node temp = null;        if (first != null) {            temp = first;            for (int i = 0; i < index; i++) {                temp = temp.next;            }        }        return temp.getObj();    }    /**     * 修改index处对应节点的信息     * */    public void update(int index,Object obj) {        checkIndex(index);        Node temp = node(index);        if (temp != null) {            temp.setObj(obj);        }    }    /**     * 索引检查     */    public void checkIndex(int index) {        if (index < 0 || index >= size) {            throw new IndexOutOfBoundsException("索引越界了");        }    }    /**     * 返回指定索引的节点     * LinkedList     * @param index     * @return     */    public Node node(int index) {        checkIndex(index);        Node temp = null;        if (first != null) {            temp = first;            for (int i = 0; i < index; i++) {            temp = temp.next;            }        }        return temp;    }    /**     * 将链表转换成数组     * */    public Object[] toArray() {        Object[] obj = new Object[size];        for (int i = 0; i < size; i++) {            obj[i] = get(i);        }        return obj;    }    /**     * 将链表转换成字符数组输出     * */    public String toString() {        return Arrays.toString(toArray()).replaceAll(" ", "");    }    /**     * 测试方法     * @param args     */    public static void main(String[] args) {        MyLinkedList m = new MyLinkedList();        m.add("aaa");        m.add("bbb");        m.add("ccc");        m.add("ddd");        m.add("eee");        m.add("fff");        m.add(123);        m.removeLast();        System.out.println(m.size());        System.out.println(m.get(5));        System.out.println(m.toString());    }}

节点信息:

/** * 节点信息 *@author 莱格 */public class Node {    /**     * 保存上一个节点的信息     * */    Node previous;    /**     * 保存本节点的信息     * */    private 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;    }}
原创粉丝点击