Java 双向链表

Java 双向链表

Demo

package linkedlist;

/**
 * 双向链表
 * @param <T>
 */
public class DoubleLinkedList<T> {
    // 定义空的头结点
    private DoubleNode<T> head = new DoubleNode<>(null, null, null);

    // 链表有效元素个数
    int size = 0;

    /**
     * 校验元素下标是否在合法范围内
     *
     * @param index
     * @return
     */
    private boolean checkIndex(int index) {
        if (index >= 0 && index < size) {
            return true;
        }
        return false;
    }

    /**
     * 新增元素
     * 插入到链表尾部
     *
     * @param data
     */
    public void add(T data) {
        DoubleNode<T> newNode = new DoubleNode<>(data, null, null);
        DoubleNode<T> temp = head;
        while (null != temp.next) {
            temp = temp.next;
        }
        temp.next = newNode;
        newNode.pre = temp;
        size++;
    }

    /**
     * 链表头插入新节点
     *
     * @param data
     */
    public void addFirst(T data) {
        DoubleNode<T> newNode = new DoubleNode<>(data, null, null);
        newNode.next = head.next;
        newNode.pre = head;
        head.next = newNode;
        size++;
    }

    /**
     * 用指定元素替换列表中指定位置的元素
     *
     * @param index
     * @param data
     * @return
     */
    public T set(int index, T data) {
        if (!checkIndex(index)) {
            throw new IndexOutOfBoundsException();
        }
        DoubleNode<T> temp = head.next;
        for (int i = 0; i < index; i++) {
            temp = temp.next;
        }
        T oldData = temp.data;
        temp.data = data;
        return oldData;
    }

    /**
     * 从链表中移除第一次出现的指定元素
     *
     * @param obj 待移除元素
     * @return true:元素存在,移除成功;false:元素不存在,移除失败
     */
    public boolean remove(Object obj) {
        // temp指向的是待删除节点,注意,此处与单链表有区别
        DoubleNode<T> temp = head.next;
        while (null != temp) {
            if (obj.equals(temp.data)) {
                // 被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收
                temp.pre.next = temp.next;
                // 非最后一个节点,刷新前指针
                if(null != temp.next){
                    temp.next.pre = temp.pre;
                }
                size--;
                return true;
            }
            temp = temp.next;
        }
        return false;
    }

    /**
     * 遍历,打印元素
     */
    public void linkedListPrint() {
        DoubleNode<T> temp = head.next;
        if (null == temp) {
            return;
        }
        while (null != temp) {
            System.out.println(temp.data);
            temp = temp.next;
        }
    }

}

/**
 * 双向链表节点定义
 *
 * @param <T>
 */
class DoubleNode<T> {
    T data;
    DoubleNode<T> next;
    DoubleNode<T> pre;

    public DoubleNode(T data, DoubleNode<T> next, DoubleNode<T> pre) {
        this.data = data;
        this.next = next;
        this.pre = pre;
    }
}

 

posted @ 2020-06-18 00:50  6xiong  阅读(120)  评论(0编辑  收藏  举报