4.23Java自定义链表最终封装与完善

封装索引判断方法

/*索引的封装处理*/
    private void checkRange(int index){
        if (index < 0 || index > size - 1){
            throw new RuntimeException("索引数字不合法" + index);
        }
    }

最终版本:

package com.MyCollection;

/**
 * 自定义链表
 * 最终的方法封装与泛型
 * 可以封装的地方---索引的处理
 * @author Lucifer
 */
public class LcfLinkedList05<E> {

    private Node first;

    private Node last;

    private int size;

    /*新增一个add方法---方法的重载,方法名相同,形参不同*/
    //定义好属性---new节点,temp临时节点,up节点---在几号索引位置插入什么对象值
    public void add(int index, E element){
        checkRange(index);
        //传进来的对象就是新的节点---要插入的元素
        Node newNode = new Node(element);
        //传进来的索引就是要插入的索引
        Node temp = getNode(index);
        //进行判断,判断临时节点不为空的情况
        if (temp != null){
            //将上一个节点的值赋值给一个Node对象,利用Node对象的方法进行节点指向的转换---我先指向你,你再去指向它,他在来指向我。绕一圈
            Node up = temp.previous;

            //新对象尾节点指向插入对象
            up.next = newNode;
            //插入对象的头节点指向up
            newNode.previous = up;

            //插入对象的尾节点指向temp临时对象
            newNode.next = temp;
            //临时temp对象的头节点指向插入对象
            temp.previous = newNode;

        }
    }

    /*链表的remove方法---修改节点指向即可*/
    //根据索引值拿到节点,进行判断,如果节点不为空,把自己删掉。删掉的方法是它的上一个节点直接指向它的下一个节点
    public void remove(int index){
        checkRange(index);
        //创建临时节点,将获取到的节点信息赋值给临时节点
        Node temp = getNode(index);
        //进行判断---考虑第一个元素
        if (temp != null){
            //创建两个对象代表节点
            Node up = temp.previous; //创建一个Node对象代表上一个节点
            Node down = temp.next; //创建一个Node对象代表下一个节点
            if (up != null){
                up.next = down; //目标节点的上一个节点的尾节点直接指向目标节点的下一个节点
            }

            if (down != null){
                down.previous = up; //等于空为第一个元素,就不做这样的操作了
            }
            /*
            如果是0号索引的元素,只会执行down != null这一句
            这样的话上一个指针就是null,所以要为头部和尾部单独写一个方法
             */
            //被删除的元素是第一个
            if (index == 0){
                //头节点直接等于下一个尾节点
                first = down;
            }

            //被删除的元素是最后一个
            if (index == size - 1){
                //尾部节点等于上一个节点up
                last = up;
            }
            size--;
        }
    }